我们有一个自引用产品与产品的关系,我很难根据数据透视表中的另一个FK返回数据。
我正在玩一个样本数据透视表,如下所示:
的 tmp_prod2prod:
affiliation_type_id
FK指的是这张表:
的 affiliation_types:
(顺便说一句,如果你想看一个完整的架构,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
?
答案 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