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!


11 comentarios

Inicia sesión para comentar

Comentarios:

  • Antonio Góngora

    Antonio Góngora hace 1 año

    En laravel 10 la solución a la creación de la carpeta posts y las imagenes faker:

    use Illuminate\Support\Facades\File;

    //Creamos la carpeta 

     File::makeDirectory(public_path('storage/posts'), 0777, true);

    • Sergio ┏(-_-)┛┗(-_- )┓┗(-_-)┛ hace 11 meses

      Gracias, ya estaba por buscarlo en San Google y se me ocurrio dar un vistazo a los comentarios y guala ^_^ estaba ahi la respuesta que estaba buscando, se te agradece.

      Quedaria el codigo en el archivo DatabaseSeeder.php, al borrado de la carpeta “post”, a la creación de la carpeta "posts" y a las imagenes faker, esto en Laravel version 10.35.0, agregando una linea de más a lo escrito por Antonio Góngora:

      //use Illuminate\Support\Facades\Storage; En la version 10 hay problemas al usar Storage
      use Illuminate\Support\Facades\File;

       

      //Borrar la carpeta "posts"
      File::deleteDirectory(public_path('storage/posts'));
      //crear la carpeta "posts"
      File::makeDirectory(public_path('storage/posts'), 0777, true);

       

  • Mercedes Rein Loring

    Mercedes Rein Loring hace 1 año

    Hola, estoy siguiendo el curso con laravel 10 y no consigo realizar los seeders, me salta este error:

       Error

     Call to a member function attach() on null

     at database\seeders\PostSeeder.php:27
        23▕             Image::factory(1)->create([
        24▕                 'imageable_id' =>$post->id,
        25▕                 'imageable_type'=> Post::class
        26▕             ]);
     ➜  27▕             $post->tags()->attach([
        28▕                 rand(1, 4),
        29▕                 rand(5, 8)
        30▕             ]);
        31▕         }
     1   vendor\laravel\framework\src\Illuminate\Container\BoundMethod.php:36
         Database\Seeders\PostSeeder::run()

     2   vendor\laravel\framework\src\Illuminate\Container\Util.php:41

    esta todo escrito igual que en el curso.

    Agradezco mucho vuestra ayuda

  • Walter

    Walter hace 1 año

    ? 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 2 años

    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 2 años

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

     

    Tampoco la url se guarda

     

     

    • Victor Arana Flores hace 2 años

      En el grupo Coders Free de Facebook esta fijado la solucion

    • Ruben hace 2 años

      Me podría compartir el link del video. Por favor

       

    • Alfredo Cori Mamani hace 2 meses

      Tengo el mismo error

  • Ruben

    Ruben hace 2 años

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

     

    • Victor Arana Flores hace 2 años

      El error te dice que no existe ningun archivo llamado ImageFactory

  • Walter

    Walter hace 2 años

    ? 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 2 años

    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 2 años

    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

     

    • Victor Arana Flores hace 2 años

      No lo sé estimada. Tendrías que poner tu codigo para saber que estás haciendo mal

    • Leidy Laura Patzi Tancara hace 2 años

      gracias ya lo resolvi, era cuestion del orden de las migraciones

  • Leidy Laura Patzi Tancara

    Leidy Laura Patzi Tancara hace 2 años

    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?