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 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 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) 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) A partir de Laravel 9 debemos modificar en el archivo .env la siguiente linea: FILESYSTEM_DISK=local a FILESYSTEM_DISK=public
- 3) Abrir el archivo: vendor\fakerphp\faker\src\Faker\Provider\Image.php y reemplazar las siguientes líneas de código:
- public const BASE_URL = 'https://placehold.jp'; // cambie la URL
- curl_setopt($ch, CURLOPT_FILE, $fp); //línea existente
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//nueva línea
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//nueva línea
- $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 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 hace 6 meses
Hola, Buenas Noches, me podrian ayudar a solucionar este error por favor…
-
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 hace 9 meses
cual es la diferencia de usar para imagenes en faker el tipo de dato ‘image’ y ‘imageUrl’ ??
-
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 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 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.