Laravel CarFactory获取garage表随机ID及运行报错解决问询
问题修复方案
1. 解决faker废弃警告
fakerphp/faker 1.14及以上版本不再支持属性方式调用生成器,必须使用方法调用格式,直接把对应写法改为带括号的方法调用即可:
- 把
$this->faker->name改为$this->faker->name() - 把
$this->faker->year改为$this->faker->year()
2. 解决garage_id不能为空的SQL错误
这个错误有两个常见诱因:
诱因1:字段取值逻辑错误
你当前写的Garage::inRandomOrder('id')->first('id')返回的是Garage模型实例(无数据时返回null),并不是id字段的整数值,直接赋值给garage_id字段不符合字段类型要求,推荐使用更高效的value()方法直接取字段值:
// 错误写法,返回模型实例或null 'garage_id' => Garage::inRandomOrder()->first('id'), // 正确写法,直接返回id字段的值,无数据时返回null 'garage_id' => Garage::inRandomOrder()->value('id'),
诱因2:garage表无预存数据
如果garage表本身没有任何数据,上面的写法还是会返回null,你可以加 fallback 逻辑,没有数据时自动创建一条Garage记录再取id:
'garage_id' => Garage::inRandomOrder()->value('id') ?? Garage::factory()->create()->id,
如果没有创建GarageFactory,可以先手动向garage表插入几条有效数据再运行CarFactory。
修复后的完整代码
<?php namespace Database\Factories; use App\Models\Car; use App\Models\Garage; use Illuminate\Database\Eloquent\Factories\Factory; class CarFactory extends Factory { /** * 模型对应的类名 * * @var string */ protected $model = Car::class; /** * 定义模型的默认状态 * * @return array */ public function definition() { return [ 'name' => $this->faker->name(), 'release_year' => $this->faker->year(), 'garage_id' => Garage::inRandomOrder()->value('id') ?? Garage::factory()->create()->id, 'created_at' => now() ]; } }
内容的提问来源于stack exchange,提问作者Swanito
相关产品推荐
相关产品推荐

