No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Factories y Seeders

7/21
Recursos

Aportes 27

Preguntas 7

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

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鈥檚 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鈥檚 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 鈥淪pecified 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:

鈥榤ysql鈥 => [

鈥榚ngine鈥 => 鈥業nnoDB鈥,
]

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();
  }
}

[22001]: String data, right truncated: 1406 Data too long for column 鈥榙escription鈥

Soluci贸n:

   $table->longText('description');

Tengo mas opiniones sobre cada uno de estos elementos:
.
Seeders (en espanol sembradores)
.

  • Son clases que sirven para llenar de datos las tablas.
  • Se basan o mejor se aprovechan de las factories (fabricas) para crear datos.
  • El codigo que se escribe alli es el mismo codigo que se escribiria dentro de un controlador, para crear, insertar, etc.
  • No siempre son datos falsos, podrian ser usadas para llenar tablas de dimensiones o tablas de parametros por defecto de la aplicacion. -o una tabla con constantes por ejemplo, que debas distribuir como base de tu aplicacion.

.
Factories (en espanol fabricas)
.

  • Son clases que definen como los modelos pueden ser poblados.
  • Estas clases pueden hacer uso de librerias de terceros para modificar los datos. como por ejemplo la libreria de PHP fake para crear datos falsos, datos de prueba. la libreria sluggify para crear slugs, etc
  • Y esta es lo mejor de las factories (que no se puede hacer en el seeder), permiten relacionar datos, relacionar un articulo con un usuario en el momento de la creacion.
  • Permiten crear N cantidad de registros, solamente diciendo cuantos registros queremos fabricar de dicho modelo.

Seeders聽鈫 Son los que crean los datos de informaci贸n falsa.

Factories 鈫聽Es la estructura de los datos.

para los que usan postgresql, la configuraci贸n b谩sica es esta:

DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=jlivewire8
DB_USERNAME=postgres
DB_PASSWORD=postgres

donde:
DB_DATABASE ="nombre de BD"
DB_USERNAME="Usuario de la BD"
DB_PASSWORD=鈥淐ontrase帽a鈥

si usan** Visual Studio Code**, les recomiendo la extensi贸n
PHP Namespace Resolver y al hacer clip derecho sobre una clase te da la opci贸n Import Class te agrega la linea use que necesitas.

Si les sale un error al migra en la tabla Users esta es la soluci贸n:
https://aprendible.com/blog/como-solucionar-el-error-specified-key-was-too-long-error-en-laravel

Al realizar las 鈥渕igrations鈥 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?