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/05 17:00] – [Casting] tempwininformatica:programacion:php:frameworks:laravel:bases_de_datos [2025/03/09 15:10] (actual) – [Seeders] tempwin
Línea 391: Línea 391:
 }); });
 </code> </code>
 +
 +Podemos ver todos los tipos que podríamos transformar (//casting//) desde la [[https://laravel.com/docs/12.x/eloquent-mutators#attribute-casting|documentación oficial]].
 ===== Insertar información ===== ===== Insertar información =====
  
 ==== Seeders ==== ==== Seeders ====
  
-==== Factories ====+Podemos definir qué registros estén presente siempre que creemos una tabla. Para esto existen los //seeders// en Laravel.
  
-Los //Factories// permite generar automáticamente instancias de nuestros modelos.+En la carpeta ''database/seeders/'' existe un fichero llamado ''DatabaseSeeder.php'' con un método ''run()''.
  
-<WRAP center round info 60%> +Imaginemos que cada vez que se cree una tabla de usuarios, se añada un registro de un usuario con ciertos campos: 
-En Laravel 8 hubo un cambio en la estructura y funcionamiento de los Factories+ 
 +<code php> 
 +namespace Database\Seeders; 
 + 
 +use App\Models\User; 
 +use Illuminate\Database\Seeder; 
 + 
 +class DatabaseSeeder extends Seeder  
 +
 +    /** 
 +    * Seed the application's database 
 +    */ 
 +    public function run(): void 
 +    { 
 +        $user = new User(); 
 +         
 +        $user->name = 'Pepito Grillo'; 
 +        $user->email = 'pepito@paisdelasmaravillas.com';         
 +        $user->password = bcrypt('contraseña'); 
 +         
 +        $user->save(); 
 +    } 
 +
 +</code> 
 + 
 +Si ahora ejecutamos: 
 + 
 +<code bash> 
 +php artisan migrate:fresh 
 +</code> 
 + 
 +Se habrán borrado todas las tablas, pero no se añade el registro que queremos. Para ello, debemos usar otro comando: 
 + 
 +<code bash> 
 +php artisan db:seed 
 +</code> 
 + 
 +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> </WRAP>
  
-Por defecto, Laravel incluye el factory **User** en ''database/factories/UserFactory.php''.+Podemos combinar los dos comandos anteriores de la siguiente manera:
  
-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.+<code bash> 
 +php arisan migrate:fresh --seed 
 +</code>
  
-Para generar estos datosLaravel se apoya en la biblioteca [[https://github.com/FakerPHP/Faker|Faker]] que permite generar información aleatoria:+Si queremos añadir varios registrosno es muy cómodo hacerlo todo en el fichero ''DatabaseSeeder.php''. Lo mejor es crear archivos con //seeders// por separado: 
 + 
 +<code bash> 
 +php artisan make:seeder UserSeeder 
 +</code> 
 + 
 +Esto habrá creado el fichero ''UserSeeder.php'' en ''database/seeders''Y ahí iremos creando el código para añadir usuarios. Lo mismo para ''PostSeeder.php''
 + 
 +Después tendremos que modificar el método ''run()'' del fichero ''DatabaseSeeder.php'' para indicar qué //seeders// queremos que se ejecuten:
  
 <code php> <code php>
-    // code +class DatabaseSeeder extends Seeder  
-    public function definition()+
 +    /** 
 +    * Seed the application's database 
 +    */ 
 +    public function run(): void 
 +    { 
 +        $this->call([ 
 +            PostSeeder::class, 
 +            UserSeeder::class 
 +        ]); 
 +    } 
 +
 +</code
 + 
 +Para ejecutar los //seeders//: 
 + 
 +<code bash> 
 +php artisan migrate:fresh --seed 
 +</code> 
 +==== Factories ==== 
 + 
 +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. 
 + 
 +Al crear un proyecto en Laravel, incluye el factory **User** en ''database/factories/UserFactory.php''
 + 
 +<code php> 
 +// ... 
 +    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 426: 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 435: 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.1741190458.txt.gz · Última modificación: por tempwin