Laravel 5覆盖雄辩保存方法

时间:2016-04-03 14:25:55

标签: laravel eloquent

我有复合主键,因此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->类型是指什么。

2 个答案:

答案 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行),也许这会有所帮助。