【问题标题】:Laravel seeder raise 'Column not found' about dummy columnLaravel 播种机提出关于虚拟列的“未找到列”
【发布时间】:2020-10-03 22:34:19
【问题描述】:

我有一个带有自定义属性的用户模型, 属性name 连接firstNamelastName

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 属性时,它工作正常。 谢谢。

【问题讨论】:

  • 请分享您的 UserFactory
  • 你试过把'name'放到$fillable吗?
  • 他不能将'name'放入可填充中,没有真正的名为'name'的列@Wiguna R
  • 对。我的错我真的不知道$appends 是什么。我用我的母语阅读了一些文章,说如果 Accessor 方法必须是 camelCase 并且 $appends 属性必须是蛇形大小写,这就是 OP 所做的。 source
  • 您好,我已添加UserFactory

标签: laravel eloquent model laravel-seeding


【解决方案1】:

不要将用户集合转换为数组。这会序列化模型,在您的情况下,您将附加 name 属性,该属性是一个访问器并且不存在。

在播种时,您的模型已经无人看管,因此可填充/有看守不在发挥作用。

由于您有想要添加到关系中的模型实例(尚未保存),因此您应该使用saveMany 而不是createMany

$group->users()->saveMany(factory(App\User::class, 3)->make());

这样您就不会将模型序列化为一个数组,该数组会添加您不想尝试保存的 name 字段,因为该字段是“虚拟”字段。

虽然我不完全确定你是如何建立这种关系的。

【讨论】:

    猜你喜欢
    • 2019-11-02
    • 2015-09-14
    • 2017-09-11
    • 1970-01-01
    • 2014-12-08
    • 2015-11-10
    • 2018-12-27
    • 2013-05-25
    相关资源
    最近更新 更多