Mostrando entradas con la etiqueta Seeders. Mostrar todas las entradas
Mostrando entradas con la etiqueta Seeders. Mostrar todas las entradas

Ejemplo básico de Factory y Seeders

Crear el módelo y que cree tb las migracions y las factory:
php artisan make:model Post -mf
En la migration creada añadir:
$table->string('title');
$table->string('content');

En database\factories\PostFactory.php:
return [
'title' => $this->faker->sentence(),
'content' => $this->faker->text()
];

En database\seeders\DatabaseSeeder.php:
\App\Models\Post::factory(100)->create();

En app\Models\Post.php:
// para permitir la inserción masiva
protected $fillable = ['title', 'content'];

Y ya simplemente ejecutar el migrate pero q además ejecute los seeders (con sus factorys): php artisan migrate:fresh --seed

Factorys desde DatabaseSeeder.php

Cuando se crea un factory no es necesario tener que crear un seeder específico para llamarlo, se puede llamar directamente desde database\seeders\DatabaseSeeder.php: use App\Models\Post;
...
Post::factory(20)->create();

php artisan migrate:fresh --seed

Crear las tablas que necesita un blog con sus migraciones, sus seeders y sus factorys

https://www.youtube.com/watch?v=eC8rDAiT1OM&list=PLZ2ovOgdI-kX3XFj77zlvSQYhJyJSYQWr&index=3

IMPORTANTE:
1) Al crear los factorys hacerlo así:
php artisan make:factory Post y no como dice el tutorial: php artisan make:factory PostFactory
2) Al crear los factorys por defecto te crea:
protected $model = Model::class;
cambiarlo por el correspondiente:
protected $model = Post::class;
3) En UserSeeder.php al crear el usuario con Create da problemas, mejor hacerlo con DB:
DB::table('users')->insert(
            'name' => 'Pepito Pérez',
            'email' => 'pepitoperez@gmail.com',
            'password' => bcrypt('12345678')
            ]
);

Para volver a pasar de nuevo todas las migraciones, seeders y demás:
php artisan migrate:fresh --seed

Laravel 7: Seeder y Factory

php artisan make:seeder UsersTableSeeder
use App\User;
...
User::create([
   'name' => 'Pepito Pérez',
   'email' => 'pepitoperez@gmail.com',
   'password' => bcrypt('12345678')
]);

factory(User::class, 10)->create();

Si User::create da el create problemas hacerlo con insert:
DB::table('users')->insert([
            'name' => 'xxxx',
            'email' => 'xxx@gmail.com',
            'password' => bcrypt('12345678')
        ])

Más información en:
https://laravel.com/docs/7.x/seeding
Por defecto Laravel te crear el UserFactory.php:
$factory->define(User::class, function (Faker $faker) {
   return [
  nbsp;  'name' => $faker->name,
  nbsp;  'email' => $faker->unique()->safeEmail,
  nbsp;  'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
  nbsp;  'remember_token' => Str::random(10),
   ];
});


php artisan make:seeder EntriesTableSeeder
use App\Entry;
public function run()
{
   factory(Entry::class, 100)->create();
}


Crear el factory para Entry:
php artisan make:factory EntryFactory
use App\Entry;
...
$factory->define(Entry::class, function (Faker $faker) {
   return [
      'title' => $faker->sentence,
      'content' => $faker->text,
      'user_id' => 1
   ];
});

Por supuesto para que se ejecuten estos seeders hay que llamarlos desde el DatabaseSeeders.php:
public function run()
{
   $this->call(UsersTableSeeder::class);
   $this->call(EntriesTableSeeder::class);
}

Para borrar toda la BD, generarla de nuevo y que tire de los seeds:
php artisan migrate:fresh --seed

Seeders

Lo primero de todo es (si no existe ya) crear una función en el fichero database/seeds/DatabaseSeeder.php:
protected function truncateTablas(array $tablas) {
DB::statement('SET FOREIGN_KEY_CHECKS = 0;');
foreach ($tablas as $tabla) {
DB::table($tabla)->truncate();
}
DB::statement('SET FOREIGN_KEY_CHECKS = 1;');
}

OJO: siempre que se use DB hay que incluir:
use Illuminate\Support\Facades\DB;

Ahora creamos un nuevo model con su migración:
php artisan make:model Provincia  --migration

En esa nueva migración rellenar los campos que se quieran en el run:
Schema::create('provincias', function (Blueprint $table) {
$table->id();
$table->string("nombre_provincia");
$table->timestamps();
});

Y ejecutar el migrate para que se cree dicha tabla en la BD:
php artisan migrate

Ahora crear el Seeder:
php artisan make:seeder TablaProvinciaSeeder

y en el run de este seeder:
$provincias = ['Álava', 'Albacete', 'Alicante', 'Almería', 'Asturias', 'Ávila', 'Badajoz'];
 foreach ($provincias as $clave=>$value) {
DB::table('provincias')->insert([
'nombre_provincia' => $value
]);
}

Todo seeder que se cree hay que añadirlo al DatabaseSeeder
Por lo que en el run del DatabaseSeeder.php:
$this->truncateTablas([
'provincias'
]);
$this->call(TablaProvinciaSeeder::class);

Y ya simplemente ejecutar:
php artisan db:seed

Si en vez de usar un array queremos que nos genere nombres aleatorios sería:
use Illuminate\Support\Str;
...
for ($i=0;$i<50;$i++) {
DB::table('provincias')->insert([
'nombre_provincia' => Str::random(15)
]);
}

Seeders y migraciones

php artisan make:seeder ProfessionSeeder

Editamos el seeder:
public function run() {
     $idProf = Profession::where('title', 'Profesión Dos')->value('id');
     User::create([
            'name' => 'uno',
            'email' => 'uno2@gmail.com',
            'password' => bcrypt('1234'),
            'profession_id' => $idProf
     ]);
}

Migraciones y ejecutar los Seed:
php artisan migrate:fresh --seed

Tb se puede hacer en dos líneas:
php artisan migrate
php artisan db:seed

Para ejecutar el seeder de solo uno específico:
php artisan db:seed --class=UsersTableSeeder

Error al migrar de email no es único:
En app\Providers\AppServiceProvider.php:
public function boot() {
   Schema::defaultStringLength(191);
}