Hola, vengo del curso de Curso de Introducción a Laravel y en el exponen como buenas practicas la implementacion de migrations, factories y models para crear la BD directamente desde laravel, porque acá se realiza manualmente?
Introducción: comprende el concepto de ORM y el papel de Eloquent en Laravel
Qué aprenderás sobre eloquent ORM
¿Qué es un ORM y para qué sirve Eloquent?
Diseña la base de datos de tu proyecto con Laravel y Eloquent
Diseña un banco de proyectos y su base de datos
Crea un proyecto Laravel y configura una base de datos MySQL
Generar el modelo para la tabla de proyectos
Diferencias entre Modelo y Migración
Convenciones para los modelos
Atributos por defecto en un modelo
Realiza consultas de datos con Eloquent
Estructura de modelos, rutas y controladores para consultar datos
Chunk: fragmentando múltiples registros
Métodos de búsqueda y Not Found Exceptions
Construye un CRUD en Laravel con Eloquent
Cómo insertar nuevos registros
Actualizando registros de la base de datos
Consideraciones y buenas prácticas para eliminar datos
Consultas avanzadas con Eloquent
Query Scopes
Query Builder
Conclusiones
Cierre del curso
Lectura
Para crear un proyecto de Laravel primero debemos instalarlo, para esto se pueden tomar dos caminos: el instalador de Laravel y Composer.
...
Regístrate o inicia sesión para leer el resto del contenido.
Aportes 54
Preguntas 3
Hola, vengo del curso de Curso de Introducción a Laravel y en el exponen como buenas practicas la implementacion de migrations, factories y models para crear la BD directamente desde laravel, porque acá se realiza manualmente?
Me gusta el proyecto pero estaria más interesante si usáramos **migrates ** de laravel ♥
¿Por qué no utilizar las migraciones y mostrar más bondades de este framework?
Hola! despúes de unos días pude realizar este ejercicio, pero en vez de crear las tablas con sql las hice a partir de las migraciones. les dejo mi aporte de lo que aprendí:
Basicamente cuando hacía con código sql estaba todo bien. Pero en el reto de la clase siguiente tenias que ejecutar php artisan migrate. Qué pasaba? bueno laravel por defecto trae la tabla users (y dos más), cuando ejecutas php artisan migrate me daba el error de la tabla users ya existe. Claro acá ya la habíamos realizado con sql. Así que hay dos opciones: eliminar todos los archivos de la carpeta migrations, o escribir (que sería la manera correcta) las tablas creando los archivos con php artisan make:migrations name_archivo.
Yo hice de la segunda manera, les comparto como quedaron:
2021_01_19_180143_create_projects_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateProjectsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('projects', function (Blueprint $table) {
$table->id('project_id');
$table->unsignedBigInteger('city_id');
$table->unsignedBigInteger('company_id');
$table->unsignedBigInteger('user_id');
$table->string('name');
$table->date('execution_date')->nulleable();
$table->tinyInteger('is_active')->nulleable();
$table->timestamps();
//llaves foraneas
$table->foreign('city_id')->references('city_id')->on('cities');
$table->foreign('company_id')->references('company_id')->on('companies');
$table->foreign('user_id')->references('user_id')->on('users');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('projects');
}
}
2021_01_19_172042_create_cities_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCitiesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('cities', function (Blueprint $table) {
$table->id('city_id');
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('cities');
}
}
2021_01_19_171850_create_companies_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCompaniesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('companies', function (Blueprint $table) {
$table->id('company_id');
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('companies');
}
}
Espero les sirva el aporte! saludos.
Hola otra vez no me podía quedar con la duda asi que cree las migraciones de la base de datos jejjej
les dejo la rama en github por si quieren crear un fork o algo asi
y ejecutar
no olviden configurar la variables en el archivo .env
php artisan migrate --path=database/migrations/project_manager/
Lo hice todo con migraciones, factories y un seeder.
Esto se ve en el curso de introducción a Laravel de @italo
En mi caso prefiero PostgreSQL el DML queda asi:
CREATE TABLE projects (
project_id serial,
city_id INT NULL,
company_id INT NULL,
user_id INT NULL,
name VARCHAR(30) NULL,
execution_date DATE NULL,
is_active INT NULL,
created_at DATE NULL,
updated_at DATE NULL,
PRIMARY KEY (project_id));
CREATE TABLE users (
user_id serial,
name VARCHAR(20) NULL,
created_at DATE,
updated_at DATE,
PRIMARY KEY (user_id));
CREATE TABLE companies (
company_id serial,
name VARCHAR(20) NULL,
created_at DATE,
updated_at DATE,
PRIMARY KEY (company_id));
CREATE TABLE cities (
city_id serial,
name VARCHAR(20) NULL,
created_at DATE,
updated_at DATE,
PRIMARY KEY (city_id));
ALTER TABLE projects ADD CONSTRAINT fk_city_id FOREIGN KEY (city_id) REFERENCES cities(city_id);
ALTER TABLE projects ADD CONSTRAINT fk_company_id FOREIGN KEY (company_id) REFERENCES companies(company_id);
ALTER TABLE projects ADD CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES users(user_id);
Y en el archivo .env
solo es necesario cambiar esta linea DB_CONNECTION=mysql
por esta DB_CONNECTION=pgsql
Todo listo, base de datos conectada.
Excelente, hubiese preferido que esta clase fuera en video, se hubiese aprovechado a explicar el tema de migraciones de Laravel que es un sistema mucho mejor para poder crear la base de datos y demás, pero con esto está perfecto.
Y Tinker es una maravilla ❤️ Puedes ejecutar PHP ahí para hacer pruebas y demás:3
Si usas MacOs e instalaste XAMPP como yo, para utilizar la consola de MySQL o MariaDB tuve que moverme al directorio /Applications/XAMPP/bin y ahí ejecutar ./mysql -u <usuario> -p
O directamente, con mi usuario root:
/Applications/XAMPP/bin/./mysql -u root -p
proporcionas la contraseña que definiste para tu usuario al instalar XAMPP o MySQL y una vez dentro, con show databases
MariaDB [(none)]> show databases
verás una lista de las bases de datos y podras empezar a crear tu nueva base de datos
Es la primera vez que veo en algún tema relacionado con Laravel y BD que no se crean las tablas a partir de migraciones. Me gusta porque vamos a poder ver como conectarnos y trabajar con una BD ya creada
para instalar composer deben ir a https://getcomposer.org/download/
tuve que agregar laravel a las variables de entorno para poder crear el proyecto
Seguí el paso a paso y me funciono al primer intento. Estoy usando Windows 10.
Lo hice completamente con migraciones y la verdad es que siento que es mucho más rápido. Cuando tienes errores por ejemplo en una llave foránea te da la indicación del error.
Les comparto mis migraciones
.
Crear migración:
php artisan make:migration create_tableName_table
Es importante primero crear la migración de users, cities y companies para que al hacer las llaves foráneas en la tabla projects, estas se hagan de forma correctamente con las tablas mencionadas ya creadas previamente.
.
Y las migraciones quedaron así:
.
2022_08_27_191242_create_cities_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCitiesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('cities', function (Blueprint $table) {
$table->bigIncrements('city_id');
$table->string('name', 50);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('cities');
}
}
.
2022_08_27_191340_create_companies_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCompaniesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('companies', function (Blueprint $table) {
$table->bigIncrements('company_id');
$table->string('name', 50);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('companies');
}
}
.
2022_08_27_191503_create_users_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('user_id');
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
.
2022_08_27_191645_create_projects_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateProjectsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('projects', function (Blueprint $table) {
$table->bigIncrements('project_id');
$table->integer('budget');
$table->string('name');
$table->date('execution_date');
$table->boolean('is_active');
$table->bigInteger('city_id')->unsigned()->nullable();
$table->bigInteger('company_id')->unsigned()->nullable();
$table->bigInteger('user_id')->unsigned()->nullable();
$table->foreign('city_id')->references('city_id')->on('cities')->onDelete('set null');
$table->foreign('company_id')->references('company_id')->on('companies')->onDelete('set null');
$table->foreign('user_id')->references('user_id')->on('users')->onDelete('set null');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('projects');
}
}
.
Lo siguiente que hice fue crear mi BD y en el archivo .env colocar el nombre de dicha BD
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=project_manager
DB_USERNAME=root
DB_PASSWORD=
.
Finalmente solo fue cuestion de ejecutar las migraciones
php artisan migrate
MySQL Workbench actualmente sigue siendo gratuito?
Lo más común en el desarrollo de proyectos es que la base de datos la vas administrar por separado, es decir no desde Laravel creo que el ejemplo aplica excelentemente, muchas de las empresas se cuidan en esta parte, es decir, que al programador no le corresponde gestionar la BD desde el framework, tienen su ingeniero experto en este tema.
Si te aparece un mensaje de error
Psy Shell v0.10.4 (PHP 7.3.11 — cli) by Justin Hileman
>>> DB::connection()->getPdo();
PDOException with message 'SQLSTATE[HY000] [2002] Connection refused'
al intentar ejecutar tinker y ya revisaste que tu archivo .env es correcto y con los mismos datos te puedes conectar via consola, intenta ejecutar lo siguiente en consola de MySQL (o MariaDB):
MariaDB [(none)]> show variables like '%sock%';
Te saldrá algo así:
Variable_name | Value |
---|---|
performance_schema_max_socket_classes | 10 |
performance_schema_max_socket_instances | -1 |
socket | /Applications/XAMPP/xamppfiles/var/mysql/mysql.sock |
Copia el último valor y lo vas a agregar a tu archivo .env con la variable DB_SOCKET así:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=project_manager
DB_USERNAME=user
DB_PASSWORD=pwd
DB_SOCKET='/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock'
Y listo! podrás ejecutar tinker sin error
php artisan tinker
Psy Shell v0.10.4 (PHP 7.3.11 — cli) by Justin Hileman
>>> DB::connection()->getPdo();
=> PDO {#3270
inTransaction: false,
attributes: {
CASE: NATURAL,
Después de varios intentos lo logré, realice el proceso haciendo migraciones con artisan, para ello hay que tener mucho en cuenta lo que se llama: integridad referencial en laravel con las claves foráneas, les dejo el link que me sirvió mucho: https://styde.net/claves-foraneas-e-integridad-referencial-de-datos-en-laravel/
perfecto!!!
Listo 😃

Pasos para crear tablas de companies y cities
Nota: Es bueno que el nombre de nuestra migración hara referencia a lo que vamos a hacer.
Nota: formato para crear tablas desde una migración y te genere la estructura básica de los campos que necesita una tabla respetando el formato de Laravel.
php artisan migrate
y asi poder crear en tu base de datos la nueva tabla con los campos indicados.4.Con estos pasos podemos seguir creando nuestras tablas.
Para el caso de projects que utiliza claves foraneas es lo mismo procedimiento variando en la creación de claves foraneas como te lo muestro a continuación.
Recomendación: Sigue intentando hasta conseguir los resultado que deseas y busca el porque de cada cosas que usas. Eso me llevo a escribir este pequeño ejemplo de mis proceso. Estos links son de mucha ayuda.Saludos y éxito en este curso.
No entiendo la idea de no utilizar migraciones si se supone que estamos creando un proyecto de Laravel
Si estas en entorno linux (Ubuntu)
primero debe instalar** el servidor de mysql**
sudo apt-get install mysql-server
iniciamos el servidor
sudo service mysql start
luego usamos el comando
mysql -h localhost -u root -p
Al momento de poner la contraseña , se coloca enter ya que no se tiene y listo.
=D
aqui ya vamos mal porque un curso que nos da las buenas practicas del ORM no se va por Eloquent como decia un comentario el curso por ahora ha sido lectura is mell
Les dejo las migraciones, por si lo quieren hacer de esta forma.
users
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
companies
Schema::create('companies', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
cities
Schema::create('cities', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
projects
Schema::create('projects', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('city_id');
$table->unsignedBigInteger('company_id');
$table->unsignedBigInteger('user_id');
$table->string('name');
$table->date('execution_date');
$table->boolean('is_active')->default(1);
$table->timestamps();
$table->foreign('city_id')->references('id')->on('cities');
$table->foreign('company_id')->references('id')->on('companies');
$table->foreign('user_id')->references('id')->on('users');
});
Les comparto mi repositorio, estaré trabajando con laravel 8 y para esta clase, use las migraciones para crear la base de datos.
Para los que dicen “porque no uso migrations”, al menos en mi experiencia trabajando con Laravel en proyectos mas grandes, las migraciones se hacian demasiado complejas cuando hacía cambios o actualizaciones. Y con el paso del tiempo decidí dejar de usarlo al menos en proyectos que ya estaban funcionando. Bueno es mi opinión 😊
Para los que deseen tener las migraciones podrían generarlas usando :
https://github.com/kitloong/laravel-migrations-generator
Existe una herramiento bastante buena que es blueprint esta gran herramienta nos ahorra un poco de tiempo a la hora de crear migraciones, modelos y controladores, espero que le guste.
Realizando las migraciones creo que seria asi:
Creamos las factories con php artisan, Los modificadores -mfc significan que crearemos los Models, Factories y Controllers
php artisan make:model Projects -mfc
php artisan make:model Companies -mfc
php artisan make:model Cities -mfc
Luego procedemos a modificar cada una de las factories en database/migrations:
//Migraciones para usuarios
$table->bigIncrements('user_id');
$table->string('name')->nullable();
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
//Migraciones para projects
$table->unsignedBigInteger('city_id')->nullable(); //Relacion con las ciudades
$table->unsignedBigInteger('company_id')->nullable(); // Relacion con la compañia
$table->unsignedBigInteger('user_id')->nullable(); // Relacion con el usuairo
//Atributos
$table->string('name', 30);
$table->date('execution_date');
$table->tinyInteger('is_active');
$table->dateTime('created_at');
$table->dateTime('updated_at');
//Migraciones para companies
$table->bigIncrements('company_id');
$table->string('name', 20);
$table->timestamps();
//cities
$table->bigIncrements('city_id');
$table->string('name', 30)->nullable();
$table->timestamps();
Luego creamos la migracion para añadir las llaves foraneas en la tabla projects asi
php artisan make:migration add_foreign_key_projects_table --table=projects
y finalmente agregamos las llaves foraneas en la migracion:
$table->foreign('city_id')->references('city_id')->on('cities');
$table->foreign('company_id')->references('company_id')->on('companies');
$table->foreign('user_id')->references('user_id')->on('users');
y por ultimo el comando
php artisan:migrate
Configuración inicial, lista!
Genial ver como se inicia el proyecto cuando la base de datos ya existe.
PROBLEMA CON LA MIGRACION
Cuando crees tus migracion, en la de projects tendras que agregar las FK. Entonces primero tendras que crear la migracion de todas las tablas y colocas en consola
php artisan migrate
pero aun te faltan las FK, entonces las creas y el error que te genera de que hay errores con las FK se debe a que intenta crear las FK antes de que existan esas tablas, entonces habra errores como que hay error en su estructura, pero bueno para solucionarlo solo tienes que migrar unicamente la de projects o como sea el nombre que hayas usado. Para solo migrar una tabla, puedes usar
php artisan migrate:refresh --path=database/migrations/2021_09_01_010730_create_projects_table.php
Tiene que ser un migrate:refresh porque si pones solo migrate dira que no hay nada que migrar.
Para recapitular
Espero no tengas este problema, pero a mi me tomo al menos una horita antes de encontrar la solucion… quiza es obvio, pero habemos quienes no lo cachamos rapido 😃
Por la version de PHP (7.1.33) que utiliza la profesora yo diria que el proyecto se hizo en Laravel 5.8
No tengo pruebas, pero tampoco dudas. #SinMiedoAlExito
SI desean tambien pueden usar docker, es bastande comodo en especial en unix
https://laravel.com/docs/8.x/installation#choosing-your-sail-services
Excelente, muy bien explicado y directo al grano.
me sale el siguiente error, ayuda!!!
Para poder ejectuar php artisan tinker (me marcaba error), tuve que agregar el directorio $HOME/.composer/vendor/bin a mi PATH en MacOS.
Puedes ver el contenido actual de tu PATH con la siguiente instrucción desde consola:
echo $PATH
Pero como uso oh-my-zsh, edité el archivo .zshrc en mi directorio HOME y agregué las siguientes líneas:
export PATH="$PATH:$HOME/.composer/vendor/bin"
# Original PATH:
# <Aquí guardé mi PATH original como respaldo>
De hecho, esto se menciona en la documentación oficial de Laravel:
Para los que usan MySQL Workbench para crear la base de datos. Hay una manera de crear las migraciones directamente desde el programa. Acá les dejo una guía:
https://laravel-news.com/export-from-mysql-workbench-to-a-laravel-migration
No estoy de seguro de como hacerlo me podrian decir como instalarlo en linux. los comandos que estan al principio no me funcionaron
¿Que seria mas potente para un manejador de proyectos al que se le haran cambios mas adelante en la base de datos o como estan acomodados los datos? Crear la DB mediante querys como esta vez o estar realizando la migracion? o se pueden realizar las dos?
Gracias por la explicacion tan clara.
Conexión a la base de datos configurada en el archivo .env revision de la conexión usando tinker.
**Tinker: ** Es una consola de comandos única de Laravel donde podremos hacer pruebas funcionamiento sin tener que ejecutar toda la aplicación e interactuar con los métodos y clases de nuestro proyecto.
Dejo repositorio con proyecto en Laravel 9, se han creado las migraciones, modelos (los modelos están en blanco)
https://github.com/TheDiego350z1/project-manager
Instrucciones:
composer install
DB_DATABASE=your_data_base
php artisan migrate
Podemos Abreviar el código de creación de foreing keys de la siguiente forma
public function up()
{
Schema::create('projects', function (Blueprint $table) {
$table->id();
$table->foreignId('city_id')->constrained('cities');
$table->foreignId('company_id')->constrained('companies');
$table->foreignId('user_id')->constrained('users');
$table->string('name');
$table->date('execution_date');
$table->tinyInteger('is_active');
$table->timestamps();
});
}
El foreignId método es un alias para unsignedBigInteger mientras que el constrained método utilizará convenciones para determinar la tabla y el nombre de la columna a la que se hace referencia.
Fuente: documentación laravel
Si van a utilizar MySQL, aquí dejo el dump:
CREATE DATABASE IF NOT EXISTS project_manager;
use project_manager;
SET foreign_key_checks = 0;
DROP TABLE IF EXISTS users;
CREATE TABLE users (
user_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NULL,
created_at DATETIME,
updated_at DATETIME,
PRIMARY KEY (user_id)
);
DROP TABLE IF EXISTS companies;
CREATE TABLE companies (
company_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NULL,
created_at DATETIME,
updated_at DATETIME,
PRIMARY KEY (company_id)
);
DROP TABLE IF EXISTS cities;
CREATE TABLE cities (
city_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NULL,
created_at DATETIME,
updated_at DATETIME,
PRIMARY KEY (city_id)
);
DROP TABLE IF EXISTS projects;
CREATE TABLE projects (
project_id INT NOT NULL AUTO_INCREMENT,
city_id INT NULL,
company_id INT NULL,
user_id INT NULL,
name VARCHAR(30) NULL,
execution_date DATE NULL,
is_active TINYINT NULL,
created_at DATETIME NULL,
updated_at DATETIME NULL,
PRIMARY KEY (project_id)
);
ALTER TABLE projects ADD FOREIGN KEY (city_id) REFERENCES cities(city_id);
ALTER TABLE projects ADD FOREIGN KEY (company_id) REFERENCES companies(company_id);
ALTER TABLE projects ADD FOREIGN KEY (user_id) REFERENCES users(user_id);
SET foreign_key_checks = 1;
¡Vamos bien!
Muy buen tutorial.
Muy buen tutorial.
Vengo del curso de PHP con laravel, me esta gustando mucho este framework.
Si utilizaste
composer global require laravel/installer
para instalar composer, puede ser que debas reiniciar tu terminal para ejecutar la siguiente instrucción
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?
o inicia sesión.