Herramientas de usuario

Herramientas del sitio


informatica:programacion:php:frameworks:laravel:bases_de_datos

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
informatica:programacion:php:frameworks:laravel:bases_de_datos [2025/03/06 10:53] – [Seeders] tempwininformatica:programacion:php:frameworks:laravel:bases_de_datos [2025/03/09 15:10] (actual) – [Seeders] tempwin
Línea 440: Línea 440:
  
 Esto poblará las tablas de las bases de datos con lo que hemos programado. Esto poblará las tablas de las bases de datos con lo que hemos programado.
 +
 +<WRAP center round info 80%>
 +Si queremos ejecutar solo un determinado //seeder//:
 +
 +<code bash>
 +php artisan db:seed --class=NombreSeeder
 +</code>
 +</WRAP>
  
 Podemos combinar los dos comandos anteriores de la siguiente manera: Podemos combinar los dos comandos anteriores de la siguiente manera:
Línea 480: Línea 488:
 ==== Factories ==== ==== Factories ====
  
-Los //Factories// permite generar automáticamente instancias de nuestros modelos.+Los //factories// son clases con el nombre de un modelo y luego una definición donde indicamos cómo queremos rellenar los datos del modelo. Funcionan como una serie de fábricas donde indicamos qué queremos que se cree en cada campo.
  
-<WRAP center round info 60%> +Al crear un proyecto en Laravel, incluye el factory **User** en ''database/factories/UserFactory.php''.
-En Laravel 8 hubo un cambio en la estructura y funcionamiento de los Factories +
-</WRAP> +
- +
-Por defectoLaravel incluye el factory **User** en ''database/factories/UserFactory.php''. +
- +
-Los factories son clases con el nombre de un modelo y luego una definición donde indicamos cómo queremos rellenar los datos del modelo. +
- +
-Para generar estos datos, Laravel se apoya en la biblioteca [[https://github.com/FakerPHP/Faker|Faker]] que permite generar información aleatoria:+
  
 <code php> <code php>
-    // code +// ... 
-    public function definition()+    public function definition(): array
     {     {
         return [         return [
-            'name' => $this->faker->name(), +            'name' => fake()->name(), 
-            'email' => $this->faker->unique()->safeEmail(),+            'email' => fake()->unique()->safeEmail(),
             'email_verified_at' => now(),             'email_verified_at' => now(),
-            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password+            'password' => static::$password ??= Hash::make('password'),
             'remember_token' => Str::random(10),             'remember_token' => Str::random(10),
         ];         ];
 +    }
 +</code>
 +
 +Para generar estos datos, Laravel se apoya en la biblioteca [[https://github.com/FakerPHP/Faker|Faker]] que permite generar información aleatoria.
 +
 +Para llamar a un //factory// existente, primero hay que modificar el método ''run()'' de ''DatabaseSeeder.php'':
 +
 +<code php>
 +class DatabaseSeeder extends Seeder 
 +{
 +    /**
 +    * Seed the application's database
 +    */
 +    public function run(): void
 +    {
 +        // ...
 +        User::factory(10)->create();
 +    }
 +}
 +</code>
 +
 +En el código anterior indicamos que queremos crear 10 registros de usuarios utilizando el //factory// ''UserFactory.php''
 +
 +Para ejecutar el //factory//:
 +
 +<code bash>
 +php artisan migrate:fresh --seed
 +</code>
 +
 +También podíamos haber colocado el código de //factory// en ''UserSeeder.php'':
 +
 +<code php>
 +// ...
 +    public function run(): void
 +    {
 +        $user = new User();
 +        
 +        $user->name = 'Pepito Grillo';
 +        $user->email = 'pepito@paisdelasmaravillas.com';
 +        $user->password = bcrypt('alicia');
 +        
 +        $user->save();
 +        
 +        User::factory(10)->create();
     }     }
 </code> </code>
Línea 509: Línea 553:
  
 <code php> <code php>
-php artisan make:factory ProductFactory --model=Product+php artisan make:factory PostFactory
 </code> </code>
  
-Hemos indicado que el factory que queremos crear es para el modelo **Product**. Tendremos que rellenar la definición de la factory recién creada:+Hemos indicado que el factory que queremos crear es para el modelo **Post** siguiendo la convención del nombre. Tendremos que rellenar la definición de la //factory// recién creada:
  
 <code php> <code php>
Línea 518: Línea 562:
     {     {
         return [         return [
-            'title' => $this->faker->sentence(3), +            'title' => $this->faker->sentence(), 
-            'description' => $this->faker->paragraph(1), +            'content' => $this->faker->text(1000), 
-            'price' => $this->faker->randomFloat($maxDecimals = 2, $min = 3, $max = 100), +            'category' => $this->faker->word(), 
-            'stock' => $this->faker->numberBetween(1, 10), +            'published_at' => $this->faker->dateTime(),
-            'status' => $this->faker->randomElement(['available', 'unavailable'])+
         ];         ];
     }     }
 </code> </code>
  
-Para que un modelo pueda usar un factory, hay que importar la definición ''HasFactory'':+Es importante indicar en nuestro modelo (''app/Models/Post.php'') que tiene una //factory//:
  
 <code php> <code php>
-namespace App\Models; 
- 
 use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
-use Illuminate\Database\Eloquent\Mdeol; 
  
-class Cart extends Model +class Post extends Model
 { {
- +   use HasFactory;
-    use HasFactory; +
-     +
-    // code+
 } }
 </code> </code>
  
- +Ahora vamos a ''PostSeeder.php'' para usarlo:
-Ahora usaremos este factory para crear de forma aleatoria instancias de nuestro productoUsamos Artisan:+
  
 <code php> <code php>
-php artisan tinker+// ... 
 +    public function run(): void  
 +    { 
 +        Post::factory(100)->create(); 
 +    }
 </code> </code>
  
-Y dentro de tinker:+Ya podremos usarlo y se generarán 100 registros en la tabla ''posts'' con información aleatoria:
  
-<code> +<code bash
-App\Models\Product::factory()->count(5)->make();+php artisan migrate:fresh --seed
 </code> </code>
  
-Veremos las 5 instancias que se habrán creado. Como hemos usado ''make'', no se habrá insertado en nuestra base de datosPara ello, tendríamos que usar:+De todos modos, si nuestro ''PostSeeder.php'' queda solo con esa instrucciónmejor sería moverla a ''DatabaseSeeder.php'' haciendo que el fichero ''PostSeeder.php'' ya no sea necesario:
  
-<code> +<code php
-App\Models\Product::factory()->count(5)->create();+// ... 
 +    public function run(): void 
 +    { 
 +        Post::factory(100)->create()
 +         
 +        $this->call(
 +            UserSeeder::class 
 +        ]); 
 +    }
 </code> </code>
- 
 ==== Database seeder ==== ==== Database seeder ====
  
informatica/programacion/php/frameworks/laravel/bases_de_datos.1741254792.txt.gz · Última modificación: por tempwin