Laravel 使用带参数的模型工厂生成对象

Ale*_*hin 5 php laravel

我有这个生成新联系人的模型工厂,它使用随机company_id

$factory->define(App\Models\Contact::class, function (Faker\Generator $faker) 
{
    $company_id = Company::all()->random()->id;

    return [
        'firstname' => $faker->firstName,
        'lastname' => $faker->lastName,
        'phone' => $faker->phoneNumber,
        'email' => $faker->email,
        'company_id' => $company_id,
        'lead_id' => \App\Models\Lead::where('company_id', $company_id)->get()->random()->id,
    ];
});
Run Code Online (Sandbox Code Playgroud)

当我在种子中使用它时是可以的:

factory(App\Models\Contact::class)->create();
Run Code Online (Sandbox Code Playgroud)

但是为了测试,我需要以某种方式传递$company_id给工厂,为混凝土创建联系人company_id(我知道我可以做到->create(['company_id', $company_id])),但这只会重写来自联系人的 company_id。

当我选择时lead_id,我还需要知道当前的company_id.

如何将 company_id 作为参数传递给工厂?

vpa*_*ade 10

尝试使用这个例子:

$factory->define(App\Models\Contact::class, function ($faker, $params) {
    $company_id = $params['company_id'];
    ....
});
Run Code Online (Sandbox Code Playgroud)

这是为了创建一个新对象:

$newContact = factory(App\Models\Contact::class)->make(['company_id' => $current_company_id]);
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用的参数也存储在数据库中,那就太好了,但是如果参数“只是”一个参数呢?我尝试使用 create(['par' => value])` 进行操作,并立即收到“未找到列 'par'”错误。然后我对代码进行了一些重构,并设法使用了一个也是列的参数。就我而言,这是有道理的(它是多态关系的类名,工厂生成我请求类型的对象),但其他情况又如何呢?我可以尝试使用现有的参数,然后在工厂中覆盖该参数,但这听起来真的很黑客...... (2认同)