2014-10-27 49 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