2013-05-14 175 views
10

我有三個表:用戶,項目和user_items。用戶擁有多個項目,並且項目屬於多個用戶。Laravel 4雄辯樞軸表

的表格:

Users 
id 
username 
password 

Items 
id 
name 
equipable 

User_items 
id 
user_id 
item_id 
equipped 

的車型:

class User extends Eloquent { 
    public function items() 
    { 
     return $this->belongsToMany('Item', 'user_items') 
        ->withPivot('equipped'); 
    } 
} 

class Item extends Eloquent { 
    public function users() 
    { 
     return $this->belongsToMany('User', 'user_items'); 
    } 
} 

在樞軸(user_items)表我命名 「配備」 一個非常重要的列。

我有一個表單,用戶可以裝備,解開和扔物品。該表單具有隱藏字段,其中包含pivot(user_items)表格行ID。因此,當用戶試圖裝備物品時,系統會檢查物品是否可用。因此,我想要一個基於來自數據透視表的item_id的透視數據和項目數據的對象,我可以發送到處理程序(處理所有邏輯)。

所以我要做的是首先訪問數據透視表,然後訪問項目表。

這樣的事情(不工作):

$item = User::find(1)->items->pivot->find(1); 

這是可能的嗎?

回答

22

你首先必須包括「equipable在您的樞紐電話:

return $this->belongsToMany('User', 'user_items') 
      ->withPivot('equipable'); 

然後,你可以問雄辯,如果你的產品equipable與否:

$item = User::with('items')->get()->find(1)->items->find(2)->pivot->equipable; 

保持兩兩件事:

  1. 雄辯使用'項目'作爲內部的關鍵,以便可能會干擾。
  2. 無論您在「get()」之前放置什麼方法都是數據庫查詢的一部分。 「get()」之後的所有內容都由PHP在Object上處理。後者在大多數情況下會比較慢。
+2

謝謝!這對我幫助很大 - 在2個小時後把我的頭從桌子上敲了出來。 –

+0

有關更多詳細信息,請參閱http://laravel.com/docs/eloquent#working-with-pivot-tables –

+0

:)耶!花了我一段時間才意識到我忘了「 - >樞軸」。 +1 – rofavadeka