Laravel updateOrCreate忽略1个字段



我有以下更新或创建:

protected $fillable = ['type', 'token', 'expires_on'];
$access = Ebaytoken::updateOrCreate(
['type' => 'access_token'],
['token' => $request->access_token, 'expires_on' => $request->access_token_expires_on]
);

然而,它给出了这个错误:

SQLSTATE[23000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Cannot insert the value NULL into column 'type', table 'toolkit.dbo._ebaytokens'; column does not allow nulls. INSERT fails. (SQL: insert into [_ebaytokens] ([token], [expires_on], [updated_at], [created_at]) values (access token goes here, 2020-03-09 09:01:02, 2021-07-12 14:18:31.031, 2021-07-12 14:18:31.031))

它忽略了我的查询中的type列。

我做错了什么?

您已经在模型上定义了自己的构造函数,它不是从Model类获得的默认构造函数。Model上的构造函数将属性作为数组,并在实例中填充它们。通过这种方式,您可以创建具有属性的模型的新实例。这是构造函数的重要部分:

public function __construct(array $attributes = [])
{
...
$this->fill($attributes);
}

否则,您将无法创建一个填充了属性的新模型实例。

这就是updateOrCreate正在做的事情:

public function updateOrCreate(array $attributes, array $values = [])
{
return tap($this->firstOrNew($attributes), function ($instance) use ($values) {
$instance->fill($values)->save();
});
}

它是通过属性进行检索或使用属性创建一个新实例(第一个参数(。最终,通过这些方法调用,您可以到达正在执行以下操作的Model::newInstance

$model = new static((array) $attributes);

因此,如果没有该构造函数,它就无法创建具有这些属性的Model的新实例,在这种情况下,由于调用updateOrCreate,它是传递给updateOrCreate的第一个数组。它可以用第二个数组填充实例,因为这只是对Model实例上fill的调用。

我建议不要覆盖模型上的构造函数,但如果你真的需要,你可以展示你正在尝试做什么,也许你可以得到一些关于如何进行的建议或想法。

最新更新