2014-08-29 93 views
1

Laravel雄辩嵌套关系支点我目前正在与laravel 4 我试图检索收集与约束,但如预期与约束

模型Caracteristique这是行不通的工作

public function caracteristique() { 

    return $this->belongsTo('Caracteristique','id','id_caracteristique'); 

} 

public function produit() { 

    return $this->belongsToMany('Produit','produit_valeur'); 

} 

模型categorie

public function produit() { 

    return $this->belongsToMany('Produit','produit_categorie'); 
} 

模型produit

public function valeur() { 

    return $this->belongsToMany('Valeur','produit_valeur'); 
} 

我想:

Caracteristique,用值,其中categorie = X通过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

如果你想限制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(); 

,或者如果你想加载相关Valeur所有Caracteristique和限制仅:

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

正如你可以看到这是不是代码最好的一块使用,所以相反,只需使用连接。

+0

嗨,thx回复,非常惊讶laravel没有提供嵌套的约束的最佳解决方案,查询是可怕的! – user3384179 2014-08-29 19:25:13

+0

查询本身不是那么糟糕,但你需要的代码是。有我的公关让它更容易,但泰勒还没有合并它https://github.com/laravel/framework/pull/4954 – 2014-08-29 21:05:57

+0

我已经使用laravel本地关系来建立一个基本的,产品,类别,属性系统。你认为这是错误的做法? – user3384179 2014-08-30 04:42:41