2014-11-23 139 views
0

我理解得不錯的關係的問題,讓我們去點查詢關係Laravel雄辯ORM

我有3個表,影響其正常模式

receipt 
- id 
- date 

items_sold 
- id 
- receipt_id 
- item_id 

items 
- id 
- name 

這個問題我通過items_sold收到「許多」項目,但我不能使用「hasManyThrough」,因爲雄辯使用「items_sold」的錯誤「id」,即使我手動輸入密鑰

class Receipt extends Eloquent { 

    public function items() 
    { 
     return $this->hasManyThrough('Items', 'ItemsSold', 'receipt_id', 'id'); 
    } 

} 

沒有辦法通過這樣的方式來做到這一點,但是我能找到雄辯的關係的方法,可以幫助我,這種情況下

+0

從「items_sold'.'id' ='items'.'id'」內容加入'items_sold'中選擇'items'。*,'items_sold'.'receipt_id'其中'items_sold'.'receipt_id' = 1 這是聲明雄辯時許,everithing是正確的,除了這部分「'items_sold'.'id' ='items'.'id'」應該是「'items_sold'.'item _id' ='items'.'id'「 – user3369524 2014-11-23 15:37:34

回答

1

正如lukasgeiter所述,添加到模型中的belongsToMany()關係將允許您訪問相關數據。

還有一點需要注意的是,如果將連接表名稱更改爲item_reciept,則可以在模型中定義多對多關係,而無需專門指定連接表。當Laravel在沒有指定連接表名的情況下看到belongsToMany方法時,它會查找蛇形案件涉及的兩個模型的名稱以及小寫名稱的字母順序。

你的模型方法應該是:

class Receipt extends Eloquent{ 

    public function items(){ 
     return $this->belongsToMany('Item'); 
    } 
} 

class Item extends Eloquent{ 

    public function reciepts(){ 
     return $this->belongsToMany('Reciept'); 
    } 
} 

我能理解,如果你不希望重命名items_sold表,因爲它是特定的名稱表示它是使用過去只是一個連接表。

另一件事需要注意添加這些關係的模型是,它允許您與您的要求可能在你的情況是有幫助的執行eager loading

比方說,你想獲得的所有項目特定收到它的ID都一氣呵成。您可以使用以下請求獲得一切融合在一起:

$receiptAndItems = Receipt::with('items')->find($recieptId); 

這將返回無論在您的特定收據記錄和細節的關鍵items與所有爲給收據相關項目記錄:

// Your `receipt` record 
// this is the output when you add `->toArray()` at the end to make it a bit easier to read 

array (size=7) 
    'id' => int 2 
    'name' => string 'Foo' (length=12) 
    'created_at' => string '2014-11-22 16:30:02' (length=19) 
    'updated_at' => string '2014-11-22 16:30:02' (length=19) 
    'items' => 
    array (size=3) 
     0 => 
     array (size=7) 
      'id' => int 1 
      'name' => string 'Bar' (length=13) 
      'created_at' => string '2014-11-22 16:30:02' (length=19) 
      'updated_at' => string '2014-11-22 16:30:02' (length=19) 
      'pivot' => 
      array (size=2) 
       ... 
     1 => 
     array (size=7) 
      'id' => int 2 
      'name' => string 'Baz' (length=20) 
      'created_at' => string '2014-11-22 16:30:02' (length=19) 
      'updated_at' => string '2014-11-22 16:30:02' (length=19) 
      'pivot' => 
      array (size=2) 
       ... 
     2 => 
     array (size=7) 
      'id' => int 3 
      'name' => string 'FooBarBaz' (length=18) 
      'created_at' => string '2014-11-22 16:30:02' (length=19) 
      'updated_at' => string '2014-11-22 16:30:02' (length=19) 
      'pivot' => 
      array (size=2) 
+0

不錯的答案,+1爲背景資料 – lukasgeiter 2014-11-23 17:05:07

+0

沒問題。我不想掏你的支票,但我只是通過計算我目前的項目了很多這個,所以我想支付它轉發:) – 2014-11-23 17:22:03

+1

不用擔心。我肯定有人會有一天會欣賞它:) – lukasgeiter 2014-11-23 17:24:04

1

我敢肯定,你真正需要的是一個多對一一對多關係,結果發現here

public function items(){ 
    return $this->belongsToMany('Items', 'items_sold'); 
} 

是你的模型真的叫「項目」?如果它實際上是「Item」,則相應地更改爲上述代碼中的第一個參數

+0

它的真名是另一個hehe,我犯了一個錯誤,但它會像你說的」Item「那樣,我要運行一些測試,謝謝。 – user3369524 2014-11-23 15:46:06

+0

好吧,你的權利,謝謝,我需要laravel手冊模擬xD – user3369524 2014-11-23 15:49:52

+0

沒問題:)如果你的問題解決了,請接受我的回答 – lukasgeiter 2014-11-23 16:00:31