Как передавать аргументы от сеялок на фабрики?

#php #laravel #laravel-8

#php #laravel #laravel-8

Вопрос:

Я хочу передать аргументы ['site_id' => $site->id] на фабрику SiteMessage:

 <?php

namespace DatabaseSeeders;

use IlluminateDatabaseSeeder;
use AppModelsSiteMessage;
use AppModelsSite;

class SitesMessagesTableSeeder extends Seeder
{
    /**
    * Run the database seeds.
    *
    * @return void
    */
    public function run()
    {
        Site::chunk(200, function ($sites) {
            foreach ($sites as $site) {
                SiteMessage::factory()->count(rand(2, 6))->create(['site_id' => $site->id]);
            }
        });
    }
}
  

Как я могу получить эти аргументы в моем классе SiteMessage factory?

 <?php

namespace DatabaseFactories;

use IlluminateDatabaseEloquentFactoriesFactory;
use AppModelsSiteMessage;
use AppModelsSite;
use AppModelsIntegration;

class SiteMessageFactory extends Factory
{
   
    protected $model = SiteMessage::class;

    public function definition()
    {
        return [
             **// Soliution: remove line below, it will be overridden automaticaly. \**
            'site_id'       => $arguments['site_id'], // Neet to use Id that I passed from seeder. 
            'integration_id'=> Integration::inRandomOrder()->first()->id,
            'type'          => rand(0,1) ? 'EMAIL' : 'SMS',
            'title'         => $this->faker->text($maxNbChars = 12),
            'description'   => $this->faker->sentence,
            'message'       => $this->faker->sentence,
            'enabled'       => 1,
            'created_at'    => now(),
            'updated_at'    => now(),
        ];
    }
}
  

В более старой заводской версии Laravel я мог передавать их в обратном вызове следующим образом:

 $factory->define(SiteMessage::class, function (Faker $faker, array $arguments = []) {
//
});
  

но не знаю, как этого добиться с помощью новых фабрик классов. Любая помощь была бы очень признательна 🙂

Ответ №1:

Как вы можете видеть в документации laravel о сохраняющихся моделях с фабриками, когда вы вводите:

 SiteMessage::factory()->count(rand(2, 6))->create(['site_id' => $site->id]);
  

Атрибут site_id из SiteMessage factory будет переопределен указанным $site->id вами.