我目前正在使用laravel 4 我试图用约束检索集合但它没有按预期工作
model Caracteristique:
public function valeur() {
return $this->hasMany('Valeur','id_caracteristique','id');
}
模型valeur
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 through produit
最终目标:能够解析像
这样的集合caracteristique-> valeur;
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();
有最佳实践的人吗?
答案 0 :(得分:0)
如果您想要限制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();
正如您所看到的,这不是最好的代码片段,因此只需使用连接。