Laravel seeder raise 'Column not found' 关于虚拟列
Laravel seeder raise 'Column not found' about dummy column
我有一个带有自定义属性的用户模型,
连接 firstName
和 lastName
的属性 name
:
class User extends Authenticatable
{
/**
* @var array
*/
protected $fillable = ['firstName', 'lastName'];
protected $appends = [
'name'
];
public function getNameAttribute(){
return $this->attributes['firstName'] . ' ' . $this->attributes['lastName'];
}
}
此外,我与 Group
模型存在多对多关系。
问题是,当我尝试播种时:
factory(App\Group::class, 30)
->create()
->each(function ($group) {
$group->users()->createMany(factory(App\User::class, 3)->make()->toArray());
});
我遇到异常:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name' in 'field list'
我的工厂:
$factory->define(User::class, function (Faker $faker) {
return [
'firstName' => $faker->firstName,
'lastName' => $faker->lastName,
];
});
当我评论 name
属性时,它工作正常。
谢谢。
不要将用户集合转换为数组。这会序列化模型,在您的情况下,您要附加 name
属性,该属性是一个访问器并且不存在。
播种时,您的模型已经无人看管,因此 fillable/guarded 不在游戏中。
由于您有模型实例(尚未保存)要添加到关系中,因此您应该使用 saveMany
而不是 createMany
。
$group->users()->saveMany(factory(App\User::class, 3)->make());
这样您就不会将模型序列化为一个数组,该数组会添加您不想尝试保存的 name
字段,因为该字段是 'virtual'.
虽然我不完全确定你是如何建立这种关系的。
我有一个带有自定义属性的用户模型,
连接 firstName
和 lastName
的属性 name
:
class User extends Authenticatable
{
/**
* @var array
*/
protected $fillable = ['firstName', 'lastName'];
protected $appends = [
'name'
];
public function getNameAttribute(){
return $this->attributes['firstName'] . ' ' . $this->attributes['lastName'];
}
}
此外,我与 Group
模型存在多对多关系。
问题是,当我尝试播种时:
factory(App\Group::class, 30)
->create()
->each(function ($group) {
$group->users()->createMany(factory(App\User::class, 3)->make()->toArray());
});
我遇到异常:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name' in 'field list'
我的工厂:
$factory->define(User::class, function (Faker $faker) {
return [
'firstName' => $faker->firstName,
'lastName' => $faker->lastName,
];
});
当我评论 name
属性时,它工作正常。
谢谢。
不要将用户集合转换为数组。这会序列化模型,在您的情况下,您要附加 name
属性,该属性是一个访问器并且不存在。
播种时,您的模型已经无人看管,因此 fillable/guarded 不在游戏中。
由于您有模型实例(尚未保存)要添加到关系中,因此您应该使用 saveMany
而不是 createMany
。
$group->users()->saveMany(factory(App\User::class, 3)->make());
这样您就不会将模型序列化为一个数组,该数组会添加您不想尝试保存的 name
字段,因为该字段是 'virtual'.
虽然我不完全确定你是如何建立这种关系的。