Laravel Eloquent 嵌套关系枢轴与约束
Posted
技术标签:
【中文标题】Laravel Eloquent 嵌套关系枢轴与约束【英文标题】:Laravel Eloquent nested relation pivot with constraint 【发布时间】:2014-10-23 06:57:38 【问题描述】:我目前正在使用 laravel 4 我正在尝试检索带有约束的集合,但它没有按预期工作
模型特征:
public function valeur()
return $this->hasMany('Valeur','id_caracteristique','id');
模型价值
public function caracteristique()
return $this->belongsTo('Caracteristique','id','id_caracteristique');
public function produit()
return $this->belongsToMany('Produit','produit_valeur');
型号类别
public function produit()
return $this->belongsToMany('Produit','produit_categorie');
模型产品
public function valeur()
return $this->belongsToMany('Valeur','produit_valeur');
我想要:
Caracteristique,其中 categorie = x 到 produit 的值
最终目标:能够像
一样解析集合特征->价值;
在 SQL 中
SELECT c.id,v.id FROM caracteristique c
INNER JOIN valeur v on (v.id_caracteristique = c.id)
INNER JOIN produit_valeur pv on (pv.valeur_id = v.id)
INNER JOIN produit_categorie pc on (pc.produit_id = pv.produit_id)
GROUP by c.id
当我在雄辩的关系中使用加入时不再可用
我已经试过了:
$carac = Caracteristique::with(array('valeur.produit.categorie' => function($q)
$q->whereCategorieId(2);
))->get();
但是没有遵守约束..
有什么想法吗?
问候,
找到这个糟糕的解决方案...
$values = Valeur::whereHas('produit',function($q)
$q->whereHas('categorie',function($q)
$q->where('categorie.id','=',2);
);
)->lists('id');
$carac = Caracteristique::with(array('valeur' =>function ($q) use($values)
$q->wherein('id',$values);
))->get();
有最佳实践的人吗?
【问题讨论】:
【参考方案1】:如果你想限制Caracteristique
:
$catId = 2;
Caracteristique::whereHas('valeur', function ($q) use ($catId)
$q->whereHas('produit', function ($q) use ($catId)
$q->whereHas('categorie', function ($q) use ($catId)
$q->where('cateogorie.id', $catId);
);
);
)->get();
或者如果您想加载所有Caracteristique
并仅限制相关Valeur
:
Caracteristique::with(['valeur' => function ($q) use ($catId)
$q->whereHas('produit', function ($q) use ($catId)
$q->whereHas('categorie', function ($q) use ($catId)
$q->where('cateogorie.id', $catId);
);
);
])->get();
如您所见,这不是最好的代码,因此只需使用连接即可。
【讨论】:
嗨,谢谢回复,非常惊讶 laravel 没有为嵌套约束提供最佳解决方案,查询很糟糕! 查询本身并没有那么糟糕,但是你需要做的代码是。我的 PR 可以让它变得更容易,但 Taylor 还没有合并它 github.com/laravel/framework/pull/4954 我已经使用 laravel 原生关系构建了一个基本的、产品、类别、属性系统。你认为这是错误的做法吗? Eloquent 非常适合用于基本内容和快速设置。但是,当应用程序需要复杂的逻辑时,我会使用存储库和自定义方法,最后如果需要进一步改进,通常用 Doctrine 替换 Eloquent,这有点不同。话虽如此,我不会说这是错误的方式,但是将来您可能会发现它不足以满足您的需求。 好吧,我明白了,第一个查询没有用categorieID过滤,返回所有的caracteristique/valeur的数据很奇怪......以上是关于Laravel Eloquent 嵌套关系枢轴与约束的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent Query 包含枢轴和关系