Laravel:订购了许多关系

时间:2015-01-03 12:09:51

标签: php laravel eloquent

我在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.

我该如何解决?

1 个答案:

答案 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会为你完成这项工作。