简体   繁体   English

如何将参数从播种机传递给工厂?

[英]How to pass arguments from seeders to factories?

I want to pass arguments ['site_id' => $site->id] to SiteMessage factory:我想将参数['site_id' => $site->id] site- ['site_id' => $site->id]传递给 SiteMessage 工厂:

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\SiteMessage;
use App\Models\Site;

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]);
            }
        });
    }
}

How can I get those argument in my SiteMessage factory class?如何在 SiteMessage 工厂类中获取这些参数?

<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use App\Models\SiteMessage;
use App\Models\Site;
use App\Models\Integration;

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(),
        ];
    }
}

At older Laravel factory version I could pass them in callback like so:在较旧的 Laravel 工厂版本中,我可以像这样在回调中传递它们:

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

but don't know how to achieve it with new Class factories.但不知道如何用新的类工厂来实现它。 Any help would be very appreciated :)任何帮助将不胜感激:)

As you can see in the laravel documentation aboutpersisting models with factories , when you type:正如您在有关使用工厂持久化模型的 laravel 文档中所见,当您键入:

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

The site_id attribute from SiteMessage factory will be overrided by the $site->id you are specifying. SiteMessage 工厂的 site_id 属性将被您指定的$site->id site- $site->id覆盖。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM