2013-05-14 17 views
6

我有一張表書籍:有一個ID(int)和一個ISBN(字符串),ISBN是唯一鍵。我還有另一張桌子,我在那裏儲存了這本書的內容。我有: $ this-> hasMany('Other','isbn','isbn');雄辯:在另一個關係上使用另一列作爲主鍵

但是,這忽略了isbn。你知道這樣做的任何方式嗎?

臨時的解決辦法:

$this->primaryKey = 'isbn'; 
return $this->hasMany('Other', 'isbn'); 
+0

簡短的回答是 - 你不能。但是可能有解決方案。你能解釋你的模式嗎?爲什麼你不能把'book_id'作爲你的fk? –

+0

這是一個現有的數據庫,它很糟糕(這不是唯一的問題) –

回答

1

這是不可能的 - 只有少數情況下,你想鏈接到一個獨特的列在表上,是不是也該峯。也就是說,其他框架已經開發出改變主鍵的方法,而且還沒有人正式向Laravel提出要求。你可以write up a proposal on GitHub,它可能會使它未來的版本。


看你的了一會兒具體的例子 - 這可能有意想不到的結局,當你來到使用預先加載的情況下的關係,它只佔關係的一個側面。當你在Other上添加belongsTo時,你會遇到相反的問題。

可以通過isbn建立關係;然而,這將採取書的形式,書號,書號歸屬於書籍,ISBN有許多其他,其他屬於ISBN;並訪問屬性將看起來像$book->isbn->others$other->isbn->book

我最後的建議是擴展Book,並將新類的主鍵設置爲isbn,並將所有關係建立在該模型上。這並不理想,但其他一些解決方案可能不會那麼痛苦。

1

跌進了同樣的問題最近,我還沒有確定這是否會工作,但作爲一個理念:

class Book { 
    public function isbn() { 
     // instead of hasMany 
     return ISBN::where('isbn', $this->isbn); 
    } 
} 
+0

我確實相信你最後錯過了' - > get()'方法。我對嗎 ? – frenus

1

如果我讀這個權利,你可以通過實現這個重寫getKeyName。

public function getKeyName(){ 
     return $yourKeyName; 
    } 
+0

如果你需要模型中的其他關係呢? – frenus

+0

我相信這只是爲主鍵建立了一個非常規的名字。 – adam

0

由於至少4.2,您現在可以在hasMany中指定本地密鑰。

從文檔(4.25.2):

return $this->hasMany('Comment', 'foreign_key', 'local_key');