Configuración de Migraciones, Factories y Seeders en Laravel
Resumen
¿Cómo configurar correctamente la base de datos para nuestro proyecto?
Para trabajar eficazmente con tus datos en un proyecto, es crucial configurar adecuadamente la migración, el Factory y los archivos de semilla. Te guiaré en este proceso paso a paso, destacando cómo establecer correctamente cada componente, asegurando que tu base de datos esté lista para albergar datos de prueba confiables.
¿Cómo crear la estructura de migración?
Configurar la migración es el primer paso hacia un sólido manejo de datos. Esto implica definir la estructura y las relaciones entre las tablas en tu base de datos:
title: Definido como string, sirve para almacenar el título de cada entrada.
body: Utiliza text para mantener el contenido amplio que necesita espacio.
high_friend: Un text que permite almacenar datos embebidos como videos o notas.
user_id: Usado como referencia para conectar con la tabla de usuarios.
slug: Asegura unicidad para evitar duplicados, clave en SEO.
¿Cómo configurar el Factory y el Seeder?
Con la estructura de migración lista, el siguiente paso es preparar tus datos de prueba mediante Factory y Seeder. Este proceso es esencial para desarrollar y probar el comportamiento de tu aplicación sin comprometer datos reales.
Usuario de pruebas: Crea un usuario de forma manual para tener control total sobre el acceso durante las pruebas.
Posts de prueba: Usa el Factory para generar múltiples entradas (24 en este caso) y simular un ambiente real de datos.
¿Cómo conectar y refrescar los datos?
Un paso clave es utilizar comandos en la terminal para ejecutar y refrescar estas configuraciones, asegurando que las tablas y datos estén correctamente establecidos.
Conectar base de datos: Crea la base de datos y conéctala adecuadamente en tu sistema.
php artisan migrate --seed
Comando de refresco: Usa comandos específicos para actualizar y poblar las tablas, garantizando un setup limpio y funcional.
¿Cómo verificar la correcta implementación?
Es crucial revisar que todo esté correctamente configurado antes de pasar al siguiente nivel del proyecto. Asegúrate de lo siguiente:
Verificar usuarios y datos generados: Comprueba en tu base de datos que el usuario de pruebas y los 24 posts estén correctamente creados y asignados.
Confirmar la encriptación de contraseñas: Revisa que las contraseñas estén debidamente encriptadas para mayor seguridad.
Con la configuración adecuada de la base de datos y los datos de prueba en su lugar, ¡estás listo para abordar la parte visual y mostrar estos datos en pantalla en tus siguientes desarrollos!
Si a este curso lo hacen con Laravel 8 se pueden volver un poco locos. Siguiendo la documentación oficial y rascandome un poco la cabeza logre hacerlo fucnionar.
PostFactory:
<?php
namespace Database\Factories;use App\Models\Post;use Illuminate\Database\Eloquent\Factories\Factory;use Illuminate\Support\Str;classPostFactoryextendsFactory{/**
* The name of the factory's corresponding model.
*
* @var string
*/protected $model =Post::class;/**
* Define the model's default state.
*
* @return array
*/publicfunctiondefinition(){return['user_id'=>1,'title'=> $this->faker->sentence,'body'=> $this->faker->text(800),];}}
Muchas Gracias, no tenia ni pies ni cabeza con el 8. );
RESUMEN
Creacion de TablasEntidades y Datos de Prueba2Crearemos la configuracion para trabajar con datos primero
A)MigrationB)FactoryC)seed
A) _create_posts_table.phppublicfunctionup(){Schema::create('posts',function(Blueprint $table){ $table->bigIncrements("id");//Define el campo Id $table->bigInteger("user_id")->unsigned();//inicializa FK $table->string("title"); $table->string("slug")->unique();//no hay 2 slugs iguales $table->string("image")}->nullable();//puede haber img o no $table->text("body"); $table->text("iframe")->nullable();//puede haber video o no $table->timestamps(); $table->foreign("user_id")->references("id")->on("users")//RELATION: //TABLA FK//En fk mira su campo id//en tabla users });}//////////////////////////////////////////////////////////////////////////B)FACTORY crear el molde para los datos de prueba
$factory->define(Post::class,function(Faker $faker){return["user_id"=>1,"title"=> $faker->sentence ,"body"=> $faker->text(800),];});//////////////////////////////////////////////////////////////////////////C)SeederclassDatabaseSeederextendsSeeder{publicfunctionrun(){//creamos 1 user para probar el sistemaApp\User::create(["name"=>"Tomas Goldenberg","email"=>"Tomasgoldenberg@hotmail.com","password"=>bcrypt("123456")]);//usamos el factory para crear 24 postsfactory(App\Post::class,24)->create();}}3CONFIGURARLABASEDEDATOS//crear la base de datos blog en tu cliente visual.envDB_CONNECTION=mysql
DB_HOST=127.0.0.1DB_PORT=3306DB_DATABASE=blog
DB_USERNAME=root
DB_PASSWORD=4TERMINALsudo php artisan migrate:fresh --seed
TABLASCREADASYRELLENADAS
En Laravel 8, si les aparece el error:
++BadMethodCallException Call to undefined method App\Models\Post::Factory()++
Deben incluir en la carpeta Models en el Post.php despues de:
++Use Slugabble;++
La siguiente linea:
++use HasFactory;++
y volver a corrrer el comando:
++php artisan migrate:refresh --seed++
Idolo, Muchas Gracias, tenia el mismo erros
la salvación.:!! me solucionastes el error en laravel 9
Al momento de ejecutar las migraciones con: php artisan migrate:refresh --seed, me muestra el siguiente error, me genera las migraciones pero al parecer el problema esta con el factory espero alguien pueda ayudarme a solucionar el problema Gracias...
hola, encontraste la solución al problema?
Yo también tengo este mismo problema. Por favor alguien que sepa como resolverlo o me describa a que se debe
Comparto mi código del **factory ** y del **seeder ** realizado en la versión de Laravel 8
Solución para los que tengan problema con la columna slug. Yo usé Laravel 8.5.24. Leí la documentación del paquete cviebrock/eloquent-sluggable.
El archivo de migración en la sentencia para definir la columna slug debe ir así:
$table->string('slug')->unique()->nullable();
En el archivo app/Models/Post.php, se debe agregar lo siguiente, la clase sluggable y una función:
namespace App\Models;use Cviebrock\EloquentSluggable\Sluggable;use Illuminate\Database\Eloquent\Factories\HasFactory;use Illuminate\Database\Eloquent\Model;classPostextendsModel{ use HasFactory; use Sluggable;publicfunctionsluggable(): array
{return['slug'=>['source'=>'title']];}}
y finalizamos ejecutando el comando migrate:refresh --seed:
php artisan migrate:refresh --seed
En la base de datos nos debe poner el la columna 'slug' lo mismo que en la columna 'title' pero ya en minusculas y con guiones para separar palabras.
Creación de tablas, entidades y datos de prueba
Configuración de la migración de La tabla Post
publicfunctionup(){Schema::create('posts',function(Blueprint $table){ $table->bigIncrements('id');// Creación de la llave foranea de usuarios $table->unsignedBigInteger('user_id'); $table->string('title'); $table->string('slug')->unique(); $table->string('image')->nullable(); $table->text('body'); $table->text('iframe')->nullable();// Crea las columnas de marca de tiempo en laravel created_at y updated_at $table->timestamps();// creación de relación entre la tabla post y usuarios $table->foreign('user_id')->references('id')->on('users');});}/**
* Reverse the migrations.
*
* @return void
*/publicfunctiondown(){Schema::dropIfExists('posts');}
Configuración de Factory de Post
<?php
/** @var \Illuminate\Database\Eloquent\Factory $factory */use App\Post;use Faker\GeneratorasFaker;$factory->define(Post::class,function(Faker $faker){return[/*
El factory debe tener una estrecha relación con la tabla
Faker es un generador de datos de pruba muy util a la hora de testear la app
*/'user_id'=>1,'title'=> $faker->sentence,'body'=> $faker->text(800)];});
Creación de los datos semilla de mi aplicación para realizar pruebas
publicfunctionrun(){/*
Creación de un usuario para realizar pruebas.
Utilizo eloquent directamente debido a que si
si lo creo medinate factory se crearia un usuario
aleatorio y no podria probar el sistema ya que no
sabria el usuario ni la contraseña.
*/App\User::create(['name'=>'Javier Amaya Patricio','email'=>'javieramayapat@gmail.com','password'=>bcrypt('123456')]);/*
Creación de 24 posts mediante factory
*/factory(Post::class,24)->create();}
configuración de la Conexión a la base de datos en el archivo .env
Revisión de la conexión a la base de datos usando Tinker antes de ejecutar cualquier migración.
Este Comando abre la consola de tinker la cual nos permite realizar pruebas de funcionamiento
php artisan tinker.
Este comando permite revisar el estado de la conexión con la base de datos, sino hay ningún error nos muestra información de la conexión de lo contrario nos manda una mensaje de error.
DB::connection()->getPdo();
Una vez comprobado que la conexión con la base de datos es correcta, podemos ejecutar las migraciones para poder crear los datos de prueba, para ello corremos el comando:
php artisan migrate:refresh --seed
Resultado de la tabla usuarios:
Resultado de la tabla post:
Muchas gracias por tu aporte.
Excelente, yo manejaré la base de datos con el nombre de "blog" que me parece un nombre más lógico para el proyecto:D
Este curso me encanta, 100% el mejor curso de php en todo platzi sin lugar a duda <3
¿Porqué se colocan la columna user_id al principio de los campos?.
Yo generalmente las coloco al final ya que cuando entro a mi base me permite visualizar los datos y al ultimo las relaciones, pero me gustaría saber si hay un motivo para esto o solo es por gusto del desarrollador.
A mi parecer, es cuestión del desarrollador.
al parecer si es por preferencia del dev :)
Y si yo ya tengo una base de datos, con mis tablas rellenas ¿Cómo se hace la migración? si eso lo que hay que hacer claro. Busco documentación pero no lo encuentro
Hola! Me topé con el mismo problema.
Puedes crear los modelos a mano
otra referencia...
Pero también puedes utilizar un importador como lo explican en Laravel Daily "Laravel 8 Migrations: Generate from Database Schema"
En el factory tuve que realizar unos cambios ya que no me ejecutaba las migracioens con laravel 8:
Comentarles que lo estoy usando con laravel SAIL con docker
gracias, estoy utilizando laravel 8, pero tengo problemas con la creacion de los post, con este error:
BadMethodCallException
Call to undefined method App\Models\Post::factory()
encontre un comentario que decia para incluir en Post.php use hasFactorie pero eso genera otro error, podria ayudarme ya que no se nada de laravel mas que de este curso
Hola , creo que estaría bien pequeñas "píldoras" con los cambios de versión.
No cambia todo y sería útil un video corto con por ejemplo en este caso los Factories en laravel 8, teniendo ya la base de esta clase.
O el cambio y uso para crear el proyecto con auth y sus nuevas plantillas etc...
Hola,
Al momento de ejecutar la migración me está generando el siguiente error:
Symfony\Component\Debug\Exception\FatalThrowableError : Interface 'Cocur\Slugify\RuleProvider\RuleProviderInterface' not found
No sé cual sea la causa ya que instalé previamente los paquetes necesarios para usar los Slug.
¿A alguno le ocurrió lo mismo?
¿Alguien sabría cómo solucionar este error? Me salta cuando ejecuto el comando para refrescar la migración junto con el seeder.
Según entiendo, tiene que ver con la librería del slug que instalamos pero, no sé exactamente cómo solucionarlo.
Ya lo solucioné, tuve un typo. 😒
Buenas me sigue generando el mismo problema, de que cuando ejecuto el comando refresh con el seed no me genera la tabla posts ni me llena las otras tablas. en las otras practicas tuve que crear los datos manuelmente para poder hacer las practicas.
esto es lo que se ejecuta en mi terminal cuando ejecuto el comando.
cabe destacar que estoy usando git-bash como terminal para el curso y php/myadmin como base de datos, es el unico gestor que tengo.
si me pueden ayudar o sugerir algo antes de continuar, muchas gracias.
Casa@DESKTOP-MBM1C0SMINGW32/c/xampp/htdocs/laravel/basic-new$ php artisan migrate:refresh --seed
Migration table not found.Migration table created successfully.Migrating: 2014_10_12_000000_create_users_table
Illuminate\Database\QueryExceptionSQLSTATE[42000]:Syntax error or access violation:1071Specified key was too
long; max key length is 767bytes(SQL: alter table `users` add unique `users_em
ail_unique`(`email`)) at C:\xampp\htdocs\laravel\basic-new\vendor\laravel\framework\src\Illuminate\Database\Connection.php:669665|// If an exception occurs when attempting to run a query, we'll format the error
666|// message to include the bindings with SQL, which will make this exception a
667|// lot more helpful to the developer instead of just the database's errors.668|catch(Exception $e){>669|thrownewQueryException(670| $query, $this->prepareBindings($bindings), $e
671|);672|}673|1C:\xampp\htdocs\laravel\basic-new\vendor\laravel\framework\src\Illuminate\
Database\Connection.php:463PDOException::("SQLSTATE[42000]:Syntax error or access violation:1071Specified key was too long; max key length is 767 bytes")2C:\xampp\htdocs\laravel\basic-new\vendor\laravel\framework\src\Illuminate\
Database\Connection.php:463PDOStatement::execute()
Este error es diferente, indida que usas un dato demasiado largo. Revisa con detalle qué usuario estás intentando crear.
Ya logre solucionarlo, para los que les da el mismo error es por la versión de PhpMyadmin o mariaDb ya que Laravel implemento un cambio en el conjunto de caracteres y todas las versiones de mysql menor a la 5.7.7 presentan este error.. para solventarlo y que corra el comando correctamente solo deben ir a esta ruta en su proyecto y hacer lo siguiente en la funcion boot():
ruta: C:...\basic-new\app\Providers\AppServiceProvider.php
y esto es lo que debe contener la funcion para establecer una longitud de cadena predeterminada:
alguien sabe como solucionar este error, me crea las tablas pero no me inserta los datos
C:\Users\AlvaroRestrepo\Documents\StudyLaravel\blog>php artisan migrate:refresh --seed
Rolling back: 2019_08_19_000000_create_failed_jobs_table
Rolled back:2019_08_19_000000_create_failed_jobs_table(0.03 seconds)Rolling back: 2014_10_12_100000_create_password_resets_table
Rolled back:2014_10_12_100000_create_password_resets_table(0.01 seconds)Rolling back: 2014_10_12_000000_create_users_table
Rolled back:2014_10_12_000000_create_users_table(0.01 seconds)Migrating: 2014_10_12_000000_create_users_table
Migrated:2014_10_12_000000_create_users_table(0.03 seconds)Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:2014_10_12_100000_create_password_resets_table(0.02 seconds)Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:2019_08_19_000000_create_failed_jobs_table(0.01 seconds)Migrating: 2020_05_14_230214_create_posts_table
Illuminate\Database\QueryExceptionSQLSTATE[42S01]:Base table or view already exists:1050Table'posts' already exists(SQL: create table `posts`(`id` bigint unsigned not null auto_increment primary key,`user_id` bigint unsigned not null,`title`varchar(191) not null,`slug`varchar(191) not null,`image`varchar(191)null,`body` text not null,`iframe` text null,`created_at` timestamp null,`updated_at` timestamp null)default character set utf8mb4 collate 'utf8mb4_unicode_ci') at C:\Users\AlvaroRestrepo\Documents\StudyLaravel\blog\vendor\laravel\framework\src\Illuminate\Database\Connection.php:671667|// If an exception occurs when attempting to run a query, we'll format the error668|// message to include the bindings with SQL, which will make this exception a669|// lot more helpful to the developer instead of just the database's errors.670|catch(Exception $e){>671|thrownewQueryException(672| $query, $this->prepareBindings($bindings), $e
673|);674|}675|1C:\Users\AlvaroRestrepo\Documents\StudyLaravel\blog\vendor\laravel\framework\src\Illuminate\Database\Connection.php:464PDOException::("SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'posts' already exists")2C:\Users\AlvaroRestrepo\Documents\StudyLaravel\blog\vendor\laravel\framework\src\Illuminate\Database\Connection.php:464PDOStatement::execute()
Que tal bro, es posible que cuando hayas ejecutado por primera vez la migración te haya dado un error, asi que, utiliza tu gestor de base de datos, elimina la base de datos, creala de nuevo. Si estas utilizando php artisan serve, finaliza el proceso, y vuelvelo a encender, despues intenta ejecutar de nuevo php artisan migrate, el error que te da es por que ya existe la tabla Post, aqui la cosa es que cuando utilizas un archivo de migración y este falla, lo que haya relizado de migración se queda a medias, es por eso que tienes que eliminar la base de datos, crearla de nuevo y ejecutar el migrate
Saludos
muchas gracias, la verdad siempre eliminaba la base de datos pero nunca se solucionó, y además siempre las creaba todas bien pero no las llenaba, en fin lo que hice fue llegar un par a mano y salio, importante, no dejarse morir!.
Cual es la diferencia entre string y text?
Por favor le rogaría que actualicen el curso, mas tiempo paso intentando solucionar los error que me genera o que debo hacer para para no tener problemas, escribo al pie de la letra el código del docente pero no siempre consigo que corra al 100
¡Hola Platzinauta! 😄
Te recomiendo revisar este aporte, espero que te sirva para realizar tu proyecto y muchas gracias por tus comentario, lo tendremos en cuenta para futuras versiones del curso.
¡Nunca pares de aprender! 💚
Me da este errror
PDOException::("SQLSTATE[HY000]: General error: 1364 Field 'slug' doesn't have a default value")