laravel - 查询生成器与Eloquent

时间:2014-04-02 14:04:08

标签: php mysql laravel eloquent

我有这样的陈述,它工作正常但不如我想要的那样好:

        $recipes = DB::table('recipes')
            ->join('category_recipe', 'recipes.id', '=', 'category_recipe.recipe_id')
            ->join('category', 'category.id', '=', 'category_recipe.category_id')
            ->join('users', 'users.id', '=', 'recipes.user_id')
            ->where('category.id', '=', $cat_id)->get(array('recipes.*','users.*'));  

我怎样才能将此翻译成Eloquent?

为什么吗
我想为多种方法使用一种视图 这个观点或者foreach看起来像这样:

        @foreach($recipes as $recipe)
        {{link_to_route('recipe_details',$recipe->title,array('id'=>$recipe->id))}} - By {{ $recipe->user->firstname }}  - Category: @foreach($recipe->category as $cat) {{ $cat->title }} @endforeach </br>
    @endforeach  

正如您所看到的,我正在使用&#34;用户&#34;关系。显然,这个foreach并不适用于顶部的Query,因为没有&#34; user&#34;模型。

那么如何将查询翻译成Eloquent?
我试过了

$recipes = Recipe::with('category')->where('category_id',$cat_id)->get();  

但这不起作用。有什么提示吗?

以下是我的模特:
Recipe.php

    public function user() {
        return $this->belongsTo('User','user_id');
}
public function category() {
        return $this->belongsToMany('Category','category_recipe');
}  

Category.php

    public function recipes() {
    return $this->belongsToMany('Recipe');
}  

User.php

    public function recipes() {
        return $this->hasMany('Recipe','user_id');
}  

谢谢!

1 个答案:

答案 0 :(得分:1)

你可以试试这个:

$recipes = Recipe::with(array('user', 'categories' => function($q) use ($cat_id) {
    $q->where('id', $cat_id);
}))->get();

以下更改:

public function category() {
    return $this->belongsToMany('Category','category_recipe');
}

收件人category categoriesRecipe.php}:

public function categories() {
    return $this->belongsToMany('Category','category_recipe');
}

顺便说一句,您也可以像这样使用join(如果您在任何情况下需要,请使用Eloquent模型):

Recipe::join('category_recipe', 'recipes.id', '=', 'category_recipe.recipe_id')
      ->join('category', 'category.id', '=', 'category_recipe.category_id')
      ->join('users', 'users.id', '=', 'recipes.user_id')
      ->where('category.id', '=', $cat_id)->get();

更新:您也可以尝试:

$recipes = Recipe::whereHas('categories', function($q) use ($cat_id) {
    $q->where('id', $cat_id);
})->with('user')->get();