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
相关产品推荐
相关产品推荐

