2016-04-03 43 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