Laravel Eloquent嵌套关系数据库与约束

时间:2014-08-29 09:19:36

标签: php laravel eloquent relationship pivot-table

我目前正在使用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();

有最佳实践的人吗?

1 个答案:

答案 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();

正如您所看到的,这不是最好的代码片段,因此只需使用连接。