Laravel:添加连接以自引用多对多关系?

时间:2014-10-27 23:53:58

标签: laravel laravel-4 many-to-many self-join self-reference

我们有一个自引用产品与产品的关系,我很难根据数据透视表中的另一个FK返回数据。

我正在玩一个样本数据透视表,如下所示:
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_types.type FK协调affiliation_type_id

1 个答案:

答案 0 :(得分:0)

在使用自定义数据透视模型,各种错综复杂的关系等进行回合后,我相信我找到了一个简单的解决方案 - 只需在您的关系中添加select语句,定位{ {1}}表格,以便您可以访问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); 关系也是一个好主意,以便将查询数量从N + 1减少到2.因此,要按ID查找特定产品:

affiliatedToProducts

或者,如果您需要检索所有产品:

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

...然后使用$model = TmpProd::with('affiliatedToProducts')->get(); 循环结果。


更新这适用于Laraval v4.2.8,但是从v4.2.11开始,似乎(违反直觉地)foreach ($model as $m) 替换了,而不是< em>添加,即查询的原始->addSelect语句,功能与仅使用select相同。因此,对于比4.2.8更新的版本,需要将原始表添加回查询,因此->select关系应以:

结尾
belongsToMany