No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

14 Días
12 Hrs
48 Min
35 Seg
Curso de Introducción a Laravel 8

Curso de Introducción a Laravel 8

Profesor Italo Morales F

Profesor Italo Morales F

Factories y Seeders

7/21
Recursos

Aportes 31

Preguntas 7

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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.

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

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

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();
  }
}
Trabajé desde Laravel 5.5, Las migraciones son de mucho cuidado, sobretodo si falla no hay rollback y se crea basura en la BD, que hay que ajustar a mano. Hoy estoy haciendo el curso pero con Laravel 11, esperando una mejora al respecto, encuentro que sigue igual. En .Net las migraciones son una maravilla, hasta las crea de manera automática el sistema solo con cambiar el modelo o un seed. Punto para .Net.

[22001]: String data, right truncated: 1406 Data too long for column ‘description’

Solución:

   $table->longText('description');
Para configurar PostgreSQL en tu proyecto Laravel, debes actualizar el archivo `.env` con la siguiente información: ``` DB_CONNECTION=pgsql DB_HOST=127.0.0.1 DB_PORT=5432 DB_DATABASE=tu_nombre_de_base_de_datos DB_USERNAME=tu_usuario DB_PASSWORD=tu_contraseña ``` Asegúrate de reemplazar `tu_nombre_de_base_de_datos`, `tu_usuario` y `tu_contraseña` con tus datos específicos. Esto permitirá que Laravel se conecte correctamente a tu base de datos PostgreSQL.
eh estado siguiendo el curso paso a paso pero cuando ejecuto php artisan migrate:fresh --seed me da un error y dice que se esta enviando un valor int y no un array, a que se debe este error ? ![](https://static.platzi.com/media/user_upload/image-b0c77095-e7e9-45d8-aec7-46290e3225b4.jpg)

Por si a alguien mas le salta error al correr el último seed, a mi me daba error porque no tenía instalado sanctum:

composer require laravel/sanctum

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=“Contraseñ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 “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?