46. Llenar con datos falsos la bbdd de un blog

En este capítulo, aprenderás cómo utilizar las factorys de Laravel para crear datos de prueba para tu blog. Las factorys son una herramienta poderosa que te permiten generar fácilmente datos de prueba para probar y validar tu aplicación. Comenzaremos por comprender los conceptos fundamentales de las factorys, incluyendo cómo definir y utilizar los modelos y las factorys. Luego, te mostraremos cómo crear factorys personalizadas para llenar tu base de datos con datos realistas y relevantes para tu aplicación. También exploraremos cómo utilizar las factorys en conjunto con las pruebas automatizadas para garantizar que tu aplicación esté funcionando correctamente. ¡Aprovecha este capítulo para aprender cómo utilizar las factorys para acelerar el proceso de desarrollo de tu blog!


9 comentarios

Inicia sesión para comentar

Comentarios:

  • Walter

    Walter hace 4 meses

    📌 2° Configuramos los Database Seeders para que funcionen los Factories

     

    📌 Creamos un seeder para crear Usuarios falsos:

     

    php artisan make:seeder UserSeeder

     

    Se crea el archivo /database/seeders/UserSeeder.php y configuramos su método run:

     

    <?php
    namespace Database\Seeders;
    
    use App\Models\User;
    use Illuminate\Database\Console\Seeds\WithoutModelEvents;
    use Illuminate\Database\Seeder;
    
    class UserSeeder extends Seeder
    {
      public function run()
      {
        User::create([
          'name' => 'Victor Arana Flores',
          'email' => 'victor.aranaf92@gmail.com',
          'password' => bcrypt('12345678')
        ]);
    
        User::factory(99)->create();
      }
    }

     

    📌 Creamos un seeder para los Post:

     

    php artisan make:seeder PostSeeder

     

    Se crea el archivo /database/seeders/PostSeeder.php y configuramos su método run:

     

    <?php
    namespace Database\Seeders;
    
    use App\Models\Image;
    use App\Models\Post;
    use Illuminate\Database\Seeder;
    
    class PostSeeder extends Seeder
    {
      public function run()
      {
        $posts = Post::factory(100)->create();
    
        foreach ($posts as $post)
        {
          Image::factory(1)->create([
            'imageable_id' => $post->id,
            'imageable_type' => Post::class
          ]);
        }
      }
    }

     

    📌 Configuramos el archivo DatabaseSeeder.php ubicado en /database/seeders/ ya que este es el único archivo que se llamará al ejecutar los seeders.

     

    <?php
    namespace Database\Seeders;
    
    use App\Models\Category;
    use App\Models\Tag;
    use Illuminate\Database\Seeder;
    use Illuminate\Support\Facades\Storage;
    
    class DatabaseSeeder extends Seeder
    {
      public function run()
      {
        Storage::makeDirectory('posts');
    
        $this->call(UserSeeder::class);
        Category::factory(4)->create();
        Tag::factory(8)->create();
        $this->call(PostSeeder::class);
      }
    }

     

    📌 Ejecutamos los seeders:

     

    php artisan migrate:fresh --seed

     

    📌 Para completar la tabla intermedia post_tag cuando ejecutamos los seeders editamos el método run() en el archivo /database/seeders/PostSeeder.php:

     

        $posts = Post::factory(100)->create();
    
        foreach ($posts as $post) {
          Image::factory(1)->create([
            'imageable_id' => $post->id,
            'imageable_type' => Post::class
          ]);
          $post->tags()->attach([
            rand(1, 4),
            rand(5, 8)
          ]);
        }

     

    📌 Volvemos a ejecutar los seeders:

     

    php artisan migrate:fresh --seed

     

    📌 Para evitar acumular imágenes con cada nueva migración con los seeders, agregamos la siguiente línea en el archivo DatabaseSeeder:

     

    Storage::deleteDirectory('posts');

     

  • Juan Ramos

    Juan Ramos hace 5 meses

    Para aquellos que tengan problemas o errores al momento de crear el faker para imágenes, aquí les dejo los tips que seguí para solucionarlo:

     

    1. 1) Debemos asegurarnos de que el acceso directo a la carpeta “storage” exista en public, en caso de no existe podemos agregar con el comando de terminal: php artisan storage:link
    2. 2) A partir de Laravel 9 debemos modificar en el archivo .env la siguiente linea: FILESYSTEM_DISK=local a FILESYSTEM_DISK=public
    3. 3) Abrir el archivo: vendor\fakerphp\faker\src\Faker\Provider\Image.php y reemplazar las siguientes líneas de código: 
    4. public const BASE_URL = 'https://placehold.jp'; // cambie la URL 
    5.  
    6. curl_setopt($ch, CURLOPT_FILE, $fp); //línea existente 
    7. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//nueva línea 
    8. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//nueva línea 
    9. $success = curl_exec($ch) && curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200;//línea existente

     

    IMPORTANTE: Estos pasos funcionan en Laravel 9, versiones anteriores pueden tener rutas y nombres de archivos diferentes.

  • Ruben

    Ruben hace 6 meses

    Buenas noches, no se me llega las imagenes a mi carpeta Posts pero si se crea la carpeta

     

    Tampoco la url se guarda

     

     

  • Ruben

    Ruben hace 6 meses

    Hola, Buenas Noches, me podrian ayudar a solucionar este error por favor…

     

  • Walter

    Walter hace 8 meses

    📌 1° Creamos los factories

     

    php artisan make:factory CategoryFactory
    php artisan make:factory PostFactory
    php artisan make:factory TagFactory
    php artisan make:factory ImageFactory

     

    Se crean en database/factories.

    Indicamos qué campos queremos que se llenen y con qué tipos de datos.

    Para generar los slugs vamos a utilizar el helper

     

    use Illuminate\Support\Str;

     

    📌 Completamos el método definition() en CategoryFactory

     

    $name = $this->faker->unique()->word(20);
    return [
    	'name' => $name,
    	'slug' => Str::slug($name)
    ];

     

    📌 En PostFactory hacemos uso de los modelos User, Post y Category:

     

    use App\Models\Category;
    use App\Models\Post;
    use App\Models\User;

     

    Completamos el método definition() :

     

    $name = $this->faker->unique()->sentence();
    return [
    	'name' => $name,
    	'slug' => Str::slug($name),
    	'extract' => $this->faker->text(250),
    	'body' => $this->faker->text(2000),
    	'status' => $this->faker->randomElement([1, 2]),
    	'category_id' => Category::all()->random()->id,
    	'user_id' => User::all()->random()->id
    ];

     

    📌 En TagFactory completamos el método definition():

     

    $name = $this->faker->unique()->word(20);
    return [
    	'name' => $name,
    	'slug' => Str::slug($name)
    ];

     

    📌 Completamos el método definition() en ImageFactory

     

    return [
    	'url' => 'posts/' . $this->faker->image(
    		'public/storage/posts', 
    		640, //ancho
    		480, //alto
    		null, //categoría
    		false //nombre sin la url
    	)
    ];

     

    Cuando subimos imágenes al servidor se guardan en /storage/app/ pero a la única carpeta que podemos acceder desde el navegador es a /public/. En esta carpeta debemos tener un acceso directo llamado storage que nos redirecciona a la carpeta /storage/app/public/ por lo tanto debemos lograr que las imágenes que subimos se guarden en esta última carpeta.

     

    📌 En caso de no tener el acceso directo storage lo generamos con:

     

    php artisan storage:link

     

    📌 Configuramos el archivo filesystems.php ubicado en /config/

     

    'default' => env('FILESYSTEM_DRIVER', 'public'),

     

    📌 Configuramos la siguiente línea del archivo .env:

     

    FILESYSTEM_DISK=public

     

    📌 Configuramos el archivo /vendor/fakerphp/faker/src/Faker/Provider/Image.php (Gracias al aporte del usuario @Juan Ramos)

     

    📌 En la clase Image configuramos la siguiente línea:

     

    public const BASE_URL = 'https://placehold.jp';

     

    📌 Y configuramos el método image de la misma clase Image con las siguientes líneas:

     

    // use cURL
    $fp = fopen($filepath, 'w');
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $success = curl_exec($ch) && curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200;
    fclose($fp);
    curl_close($ch);

     

  • Leidy Laura Patzi Tancara

    Leidy Laura Patzi Tancara hace 9 meses

    cual es la diferencia de usar para imagenes en faker el tipo de dato ‘image’ y ‘imageUrl’ ??

     

  • Leidy Laura Patzi Tancara

    Leidy Laura Patzi Tancara hace 9 meses

    tambien me sale este error : You requested 1 items, but there are only 0 items available. y mas abajo dice:   1   C:\xampp\htdocs\ProyectInmobiliaria\inmobiliaria\vendor\laravel\framework\src\Illuminate\Collections\Collection.php:951
         Illuminate\Support\Arr::random([])

     2   C:\xampp\htdocs\ProyectInmobiliaria\inmobiliaria\database\factories\ofertaFactory.php:23
         Illuminate\Support\Collection::random()    ayuda porfavor

     

  • Leidy Laura Patzi Tancara

    Leidy Laura Patzi Tancara hace 9 meses

    hola Victor tengo un problema , en el archivo connection.php me sale este error : undefined method 'get doctrine driver'.intelephense(1013), porque sale este error y como lo soluciono?

     

  • Fernando

    Fernando hace 10 meses

    Hola Victor,

    Me topé con un problema en el tutorial 45 de “Llenar con datos falsos la bbdd de un blog”, en el minuto 29:05 donde implementas el Facade Storage.

    El problema es que los ficheros *.png se generán pero automaticamente se borran, es decir, se generan, los observo que están por menos de un segundo y se auto-eliminan.

    Te imaginas por donde ir los tiros con este inconveniente?

    gracias de antemano!

    Fernando from Spain.