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 hace 11 meses
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 S. S. ┏(-_-)┛┗(-_- )┓┗(-_-)┛ hace 9 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 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 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 hace 1 año
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 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 1 mes
Tengo el mismo error
-
-
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 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 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 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 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?