2016-09-23 24 views
0

我有三個表:爲什麼Laravel關係的名稱習慣如此奇怪?

  • 用戶
    • 列:ID,名稱
    • 列:ID,名稱
  • book_user:
    • 列:USER_ID,book_id,州(not read yetreadingread already

我打算用戶book_user許多一對多關係表,所以我遵循doc命名規範:

要定義這種關係,需要三個數據庫表:用戶角色角色用戶。 role_user表來源於相關模型名稱的字母順序,並且包含user_id和role_id列。

我寫代碼:

class User extends Model 
{ 
    public function books() 
    { 
     return $this->belongsToMany('App\Book'); 
    } 
} 

,我可以檢索其通過調用user->books()與用戶的書籍。

行之有效,但是當我試圖找回這關係到用戶的書的狀態,我創建模型:

​​

當我使用這個模型,它宣稱:

Base table or view not found: 1146 Table 'myapp.book_users' doesn't exist 

結論:

  • 一個表的名稱約定可以使用的因爲多對多是<singular_noun>_<singular_noun>(例如book_user)。
  • 具有映射到模型的多個詞的表的名稱約定是<singular_noun>_<plural_noun>(例如book_users)。

我知道我可以手動設置表名該模型映射,但我只是想知道:

這是否衝突是設計缺陷或者只是我在設計表做錯了,楷模?

+0

用戶可以有很多書,所以你的關係應該是從'用戶 - >書籍'更改'hasMany'返回$ this-> belongsToMany('App \ Book');''返回$ this-> hasMany ('App \ Book');'並在'App \ Book'模型上創建reverseAssocation,在這個模型中有$ this-> belongsTo('App \ User')'。 – Samundra

回答

1

你不需要定義數據透視表的模型,只需添加withPivot從

class User extends Model 
{ 
    public function books() 
    { 
     return $this->belongsToMany('App\Book')->withPivot('state'); 
    } 
} 

然後你可以檢索書籍狀態模型樞

1

一般來說,你不需要爲數據透視表的模型。你可以定義關係的逆。如果你想在數據透視表中存儲額外的數據,也許你可以檢查withPivot方法。或者解釋你想做什麼。

但是,如果要創建模型,則需要手動在模型中指定表名。因爲Laravel不知道它是一個數據透視表還是普通表。它只是試圖通過複數來猜測表名。

相關問題