2016-04-03 67 views
2

我有复合主键,所以Laravel的save()方法无法工作。因此我需要重写save方法。例如,我的主键是一个由column_a和column_b组成的组合键。你能给我举例说明如何覆盖保存方法以及我放置的位置?Laravel 5 Override Eloquent保存方法

我的主键:column_a,column_b

我已经试过如下:

protected function setKeysForSaveQuery(Builder $query) 
{ 
    parent::setKeysForSaveQuery($query); 
    $query->where('locale', '=', $this->locale); 
    return $query; 
} 

我发现上面的代码,但它会导致500内部服务器错误甚至我打电话,仅读取值的方法从数据库。我已经将$ primaryKey ='column_a'和'locale'(在where里面)设置为column_b。我不知道$ this-> locale指的是什么?

这里是另一种方式,我发现,但它没有太

protected $secondaryKey = 'column_b'; 
function newQuery() 
{ 
    $query = parent::newQuery(); 
    $query->where($this->secondaryKey, '=', $this->type); 
    return $query; 
} 

同样,我不知道什么是$这个 - >型指。

回答

2

您可以覆盖它。你可以把它放在你的模型中,或者你可以把它放在一个特质中,如果你愿意的话,可以在多个模型中使用这个特质。

最初的save()方法是here(1449行),也许这会有所帮助。

+0

你可以给我的例子吗?我不知道如何从where子句中删除id并在查询中添加多个where子句(其他列) – OrgGila

+0

我不明白你的意思是什么,但由于这是一个新问题,我建议你创建新的回答并描述所有内容(使用代码,你想要什么,你已经尝试了什么)。我相信我或其他人会帮助你。 –

+0

我刚刚包括我试过的东西。 – OrgGila

1

我找到了解决方案。在模型中,添加的PrimaryKey变量和下面的函数

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); 
    } 
} 

来源:https://github.com/laravel/framework/issues/5517#issuecomment-113655441