Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Factories y Seeders

6/20
Recursos

Aportes 21

Preguntas 7

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Se puede hacer el llamado a los modelos asi tambien:

use App\Models\{User, Category, Course, Post};

Algo curioso de Laravel es que en versiones anteriores tu recibias al componente Faker por medio de la inyección de dependencias, ahora en Laravel 8 faker está implicito en las factories 😄
.
Pueden generar muchos tipos de datos de prueba, aquí está la documentación oficial de Faker:
.
https://github.com/fzaninotto/Faker
.
Les recomiendo instalar las extensiones de PHPIntelliSense y PHPIntelephense en VSCode para que se hagan auto imports de los namespaces en PHP ^^

Como aporte extra, también se pueden crear seeders para cada una de las entidades (UserSeeder, PostSeeder, etc) sin embargo esta practica es mas útil si quiere agregar datos ya definidos.
En el ejemplo que coloco, defino ya a un administrador y su contraseña, y aquí mismo defino el Factory, y ya desde el DatabaseSeeder llamo a este Seeder así como normalmente lo hace el profesor con los factory.

<h3>Les comparto los factories</h3>

CategoryFactory

  public function definition()
  {
    return [
      'name' => $this->faker->word
    ];
  }

CourseFactory

  public function definition()
  {
    return [
      'name' => $this->faker->sentence,
      'slug' => $this->faker->slug,
      'image' => $this->faker->imageUrl(1280,720),
      'description' => $this->faker->text(800),

      'user_id' => rand(1,5),
      'category_id' => rand(1,3)
    ];
  }

PostFactory

  public function definition()
  {
    return [
      'name' => $this->faker->sentence,
      'free' => rand(0,1),

      'course_id' => rand(1,10)
    ];
  }

Una forma más segura de asociar claves foráneas en Factories sería asignando ID’s aleatorios según los registros ya existentes en la base de datos en lugar de números aleatorios. Así, en caso de que quieras cambiar la cantidad de registros creados en los seeders, o usar ID’s con formato uuid en tus migraciones; tus Factories seguirán funcionando sin necesidad de modificar el código en varios lugares. Por ejemplo:
–
CourseFactory.php

Factories y Seeders


Los datos Seed ( o datos semilla) vendría siendo información falsa inicial en nuestras tablas.

  • Seeders → Son los que crean los datos de información falsa.
  • Factories → Es la estructura de los datos.

No importa el orden que especifiquemos en un factory.

Comando para crear las tablas en la base de datos:

php artisan migrate

Comando para borrar y volver a crear las tablas en la base de datos más los datos falsos:

php artisan migrate:fresh --seed

Si tuvieron el error de “Specified key was too long error”, solución:

  1. Actualizar la versión de MySQL
  2. Modifica el engine de mysql en el archivo config/database.php, asi:

‘mysql’ => [
…
‘engine’ => ‘InnoDB’,
]

database/seeders/DatabaseSeeder.php

<?php

namespace Database\Seeders;

use App\Models\User;
use App\Models\Category;
use App\Models\Course;
use App\Models\Post;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
  /**
   * Seed the application's database.
   *
   * @return void
   */
  public function run()
  {
    User::factory(5)->create();
    Category::factory(3)->create();
    Course::factory(10)->create();
    Post::factory(90)->create();
  }
}

Al realizar las “migrations” me daba un error por lo que leyendo la documentacion pude solucionarlo de esta manera (Idem para migrations de posts)

$table->foreign('user_id')->references('id')->on('users');
$table->foreign('category_id')->references('id')->on('categories');

También aporto lo que encontré por si a alguien le sirve.

Laravel también brinda soporte para crear restricciones de foreign keys, que se utilizan para forzar la integridad referencial en el nivel de la base de datos. Por ejemplo, definamos una columna user_id en la tabla de publicaciones que haga referencia a la columna id en una tabla de usuarios:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
 
Schema::table('posts', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id');
 
    $table->foreign('user_id')->references('id')->on('users');
});

Dado que esta sintaxis es bastante detallada, Laravel proporciona métodos adicionales y breves que usan convenciones para brindar una mejor experiencia de desarrollador. Al usar el método ForeignId para crear su columna, el ejemplo anterior se puede reescribir así:

Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained();
});

Debemos tener más cuidado en completar las sentencias y transmitir más claramente los conceptos.

Mi aporte, complementando el de la clase anterior:

si les da este error:

SQLSTATE[42000]: Syntax error or access violation: 1103 Incorrect table name '' (SQL: alter table `courses` add constraint `courses_category_id_foreign` foreign key (`category_id`) references `` (`categories`))

cambian la relacion, a mi me funciono asi:

$table->foreign('category_id')->references('id')->on('categories');

luego dio este error:

SQLSTATE[42000]: Syntax error or access violation: 1103 Incorrect table name '' (SQL: alter table `posts` add constraint `posts_course_id_foreign` foreign key (`course_id`) references `` (`courses`))

de igual manera, cambiamos la relacion y funciona:

$table->foreign('course_id')->references('id')->on('courses');

Si sale esto es porq en description se puso 800 y en la bd esta con varchar(255) solo modifiquen la descripction a text(200) o algo menor q 255

Para los que no quieren usar PHPmyadmin o Mysqlworkbench puede usar la extensión de vsc Mysql de cweijan, en el siguiente enlace pueden ver una overview de como funciona esta extensión

    public function definition()
    {
        return [
            'name' => $this->faker->sentence,
            'free' => rand(0,1),

            'course_id' => rand(1,10)
        ];
    }
    public function definition()
    {
        return [
            'name' => $this->faker->sentence,
            'slug' => $this->faker->slug,
            'image' => $this->faker->imageUrl(1280,720),
            'description' => $this->facker->text(800),

            'user_id' => rand(1,5),
            'category_id' => rand(1,3)
        ];
    }

Consulta, porque cuando hago la migración me envía este error:
Illuminate\Database\QueryException

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes (SQL: alter table users add unique users_email_unique(email))

en los factories que tienen una relación con otra tabla, no lo recomendaría como se lo ha hecho en el video, lo recomiendo de esta forma 👇

'teacher_id' => factory(Teacher::class),

$table->timestamps(); me ocurrio un error y fue porque no puse esta linea de codigo al final de la funcion

en el caso de los factories, cuando realices TDD lo mejor es utilizar factory para las relaciones

'user_id' => User::factory()->create()->id ```

asi no tienes que preocuparte por si existe o no el usuario

Si en algún punto del desarrollo estoy listo para usar la aplicación en producción y quisiera limpiar los datos semilla de las tablas, como se haría? Correría las migraciones con fresh?