You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel9中AffiliateFactory::forCompany参数类型错误求助

问题

在Laravel 9项目的Affiliate工厂中尝试关联User和Company时,运行Seeder抛出错误:

Database\Factories\AffiliateFactory::forCompany(): Argument #1 ($company) must be of type Database\Factories\Company, array given

需要主动传入user_id和company_id,确保关联正确。

AffiliateFactory代码:

<?php

namespace Database\Factories;

use App\Models\Affiliate;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use Carbon\Carbon;

class AffiliateFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Affiliate::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        $affiliate = 'aff'.Str::random(4);
        $apiHash = Str::random(32);

        return [
            'aff_id' => 'aff'.Str::random(4),
            'description' => rand(0, 100) > 50 ? $this->faker->sentence() : null,
            'api_key' => md5($affiliate.$apiHash),
            'api_hash' => $apiHash,
            'allow_submission' => $this->faker->boolean(),
            'is_favourited' => $this->faker->boolean(),
            'is_default' => $this->faker->boolean(),
            'is_enabled' => true,
            'last_used_at' => Carbon::now()->subHours(rand(0, 72))->subMinutes(rand(0, 60))
        ];
    }

    /**
     * Set the company for this factory
     *
     * @param Company $company
     * @return \Illuminate\Database\Eloquent\Factories\Factory
     */
    public function forCompany(Company $company)
    {
        return $this->state(function (array $attributes) use ($company) {
            return [
                'user_id' => $company->user_id,
                'company_id' => $company->id,
            ];
        });
    }
}

调用代码:

// create our users
$users = User::factory(10)->create();

// assign one company to each user
foreach ($users as $user) {
    Company::factory()->for($user)->count(1)->create();
}

$companies = Company::all();

foreach ($companies as $company) {
    Affiliate::factory(50)->forCompany([
        'user_id' => $company->user_id,
        'company_id' => $company->id
    ])->create();
}
解决方案

错误原因

forCompany方法定义的参数要求是Company模型实例,但调用时传入了数组,导致类型不匹配报错。

方法一:直接传入Company模型实例

调用代码里的$company已经是从数据库取出的模型对象,直接传给forCompany即可,无需手动构造数组:

foreach ($companies as $company) {
    Affiliate::factory(50)->forCompany($company)->create();
}

同时需要确保AffiliateFactory顶部引入Company模型:

use App\Models\Company; // 补充这行引入

方法二:修改forCompany方法支持传入数组

如果需要灵活传入数组参数,修改方法的参数类型和逻辑:

/**
 * Set the company and user for this factory
 *
 * @param array $data
 * @return \Illuminate\Database\Eloquent\Factories\Factory
 */
public function forCompany(array $data)
{
    return $this->state(function (array $attributes) use ($data) {
        return [
            'user_id' => $data['user_id'],
            'company_id' => $data['company_id'],
        ];
    });
}

这样原调用代码就可以正常使用,无需改动。

更简洁的写法(可选)

利用Laravel工厂的关联特性,还可以简化Seeder代码,避免手动循环:

// 创建用户并关联公司,同时生成对应的Affiliate
User::factory(10)
    ->has(Company::factory()->has(Affiliate::factory()->count(50)))
    ->create();

这种写法会自动处理user_id、company_id的关联赋值,无需手动设置。


内容的提问来源于stack exchange,提问作者Ryan H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:50:35