我有复合主键,因此Laravel的save()方法不起作用。因此我需要覆盖save方法。例如,我的主键是由column_a和column_b组成的复合键。你能举例说明如何覆盖保存方法以及我把它放在哪里吗?
我的主键:column_a,column_b
我已尝试过以下几项:
protected function setKeysForSaveQuery(Builder $query)
{
parent::setKeysForSaveQuery($query);
$query->where('locale', '=', $this->locale);
return $query;
}
我找到了上面的代码,但它导致500内部服务器错误,即使我调用的方法只读取数据库中的值。我已设置$ primaryKey =' column_a'和' locale' (在哪里)到column_b。我不知道$ this-> locale指的是什么?
这是我发现的另一种方式,但它也失败了
protected $secondaryKey = 'column_b';
function newQuery()
{
$query = parent::newQuery();
$query->where($this->secondaryKey, '=', $this->type);
return $query;
}
同样,我还不知道$ this->类型是指什么。
答案 0 :(得分:2)
I have found the solution. In the model, add primaryKey variable and the following function
protected $primaryKey = array('column1','column2');
protected function setKeysForSaveQuery(\Illuminate\Database\Eloquent\Builder $query) {
if (is_array($this->primaryKey)) {
foreach ($this->primaryKey as $pk) {
$query->where($pk, '=', $this->original[$pk]);
}
return $query;
}else{
return parent::setKeysForSaveQuery($query);
}
}
Source: https://github.com/laravel/framework/issues/5517#issuecomment-113655441
答案 1 :(得分:1)
您可以覆盖它。你可以把它放在你的模型中,或者你可以把它放在一个特性中,如果你愿意,可以在多个模型中使用这个特征。
原始的save()方法是here(第1449行),也许这会有所帮助。