2014-10-27 19 views
0

我們有自我引用的產品對產品的關係,並且我正在努力根據數據透視表中的另一個FK返回數據。Laravel:添加一個連接來自引用多對多的關係?

我玩,看起來像這樣的樣本數據透視表:
tmp_prod2prod:

  • ID
  • prod_id_to
  • prod_id_from
  • affiliation_type_id

而且那affiliation_type_id FK是指該表:
affiliation_types:

  • ID
  • 描述

(順便說一句,如果你想看到一個完整的模式,find it here on pastebin

目標:
我的目標是顯示affiliation_types.type

我的模型看起來像:

class TmpProd extends Eloquent { 

    protected $table = 'tmp_prods'; 
    public $timestamps = false; 


    public function affiliatedToProducts() 
    { 
     return $this->belongsToMany('TmpProd', 'tmp_prod2prod', 'p_id_to', 'p_id_from') 
      ->withPivot('affiliation_type_id') 
      ->join('affiliation_types', 'tmp_prod2prod.affiliation_type_id', '=', 'affiliation_types.id'); 
    } 

    public function affiliatedFromProducts() 
    { 
     return $this->belongsToMany('TmpProd', 'tmp_prod2prod', 'p_id_from', 'p_id_to'); 
    } 

} 

和我的控制器我跑:

$model = TmpProd::find(1); 
    foreach ($model->affiliatedToProducts as $cross) { 
     echo"<pre>",var_dump($cross->pivot),"</pre>\n"; 
    } 

我已經試過足夠的變化,我覺得我的頭在旋轉:)
如何根據數據透視表中的affiliation_type_id FK調整affiliation_types.type

回答

0

經過與自定義數據透視模型,各種錯綜複雜的關係等,我相信我找到了一個簡單的解決方案 - 只需添加select聲明到您的關係,目標affiliation_types表,讓你有機會獲得types列:

return $this->belongsToMany('TmpProd', 'tmp_prod2prod', 'p_id_to', 'p_id_from') 
    ->withPivot('affiliation_type_id') 
    ->join('affiliation_types', 'tmp_prod2prod.affiliation_type_id', '=', 'affiliation_types.id') 
    ->addSelect('affiliation_types.type as affiliation_type'); 

(該as affiliation_type部分是可選的,但會使你的查詢語義上更清晰)

然後,在你foreach循環,您可以撥打:

var_dump($cross->affiliation_type); 

加載您的affiliatedToProducts關係也是一個好主意,可將查詢數從N + 1減少到2個。因此,通過ID找到一個特定的產品:

$model = TmpProd::with('affiliatedToProducts')->find(1); 

或者,如果您需要檢索的所有產品:

$model = TmpProd::with('affiliatedToProducts')->get(); 

...然後在與foreach ($model as $m)結果循環。


更新:這個工作對Laraval v4.2.8,但作爲v4.2.11,似乎(直覺相反),其->addSelect取代,而不是增加,查詢的原始select語句,在功能上與使用->select相同。因此,對於比4.2.8新版本,有必要對原來的表添加回查詢,所以belongsToMany關係應該結束:

->select('affiliation_types.type', 'tmp_prods.*'); 
+0

添加'用於(爲4.2.8)addSelect',好吧,**添加**選擇語句。現在,在4.2.11中,它取代了原來的select語句,至少在'belongsToMany'關係的情況下,功能上與使用'select'相同。我試圖弄清楚爲什麼會改變,但現在唯一的解決方案是指定'tmp_prods。*',所以' - > select('affiliation_types.type','tmp_prods。*');'。或降級到v4.2.8。 :) – damiani 2014-10-28 18:19:42

+0

完成。現在來研究爲什麼這個不尋常的變化是... – damiani 2014-10-28 18:24:48

+0

感謝所有的辛勤工作 – mOrloff 2014-10-28 19:39:37