Seed a Laravel Application with Media Files

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.