我在Ingredient和Recipe之间有很多关系,有一个数据透视表(ingredient_recipe)。
我想通过有多少食谱来获取食材。例如,如果我在2个配方中使用盐,在3个配方中使用肉,我会在盐之前吃肉。
这就是我所拥有的。虽然直接在我的数据库上执行的结果查询按预期工作,但它没有正确排序,所以Laravel在内部做了一些事情,我猜。
//Ingredient model
public function recipesCount()
{
return $this->belongsToMany('Recipe')->selectRaw('count(ingredient_recipe.recipe_id) as aggregate')->orderBy('aggregate', 'desc')->groupBy('ingredient_recipe.ingredient_id');
}
public function getRecipesCountAttribute()
{
if ( ! array_key_exists('recipesCount', $this->relations)) $this->load('recipesCount');
$related = $this->getRelation('recipesCount')->first();
return ($related) ? $related->aggregate : 0;
}
//controller
$ingredients = Ingredient::with('recipesCount')->whereHas('recipes', function($q)
{
$q->where('user_id', Auth::id());
})->take(5)->get();
//outputting the last query here and executing it on my db returns correctly ordered results.
我该如何解决?
答案 0 :(得分:0)
要order by
相关表,您需要join
。无论如何都无法实现这一目标。
Ingredient::with('recipesCount')
->join('ingredient_recipe as ir', 'ir.ingredient_id', '=', 'ingredients.id')
->join('recipes as r', function ($j) {
$j->on('r.id', '=', 'ir.recipe_id')
->where('r.user_id', '=', Auth::id());
})
->orderByRaw('count(r.id) desc')
->groupBy('ingredients.id')
->take(5)
->get(['ingredients.*']);
不再需要whereHas
,因为inner joins
会为你完成这项工作。