Laravel-medialibrary is a Laravel package for associating all sorts of files with Eloquent models.
We have an Auction
model that uses the library to associate an image with each object,
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;
class Auction extends Model implements HasMedia
{
use HasFactory;
use InteractsWithMedia;
}
We wanted to seed an Eloquent model that has associated images using a seeder AuctionSeeder
:
class AuctionSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Auction::factory()
->count(10)
->create();
}
}
running a factory AuctionFactory
,
namespace Database\Factories;
use App\Models\Auction;
use Illuminate\Database\Eloquent\Factories\Factory;
class AuctionFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = Auction::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'name' => Str::substr($this->faker->words(5, true), 0, 30),
'description' => $this->faker->text(600),
];
}
To have each generated model associated with an image, we used Unsplash Source to get random images of the required size, by configuring an afterCreating
factory callback,
/**
* Configure the model factory.
*
* @return $this
*/
public function configure()
{
return $this->afterCreating(function (Item $item) {
$url = 'https://source.unsplash.com/random/1200x800';
$item
->addMediaFromUrl($url)
->toMediaCollection('auctions');
});
}
One should note that if you plan to generate many images, you need to use the Unsplash API with an API key because of usage limits.
Top comments (0)