使用Eloquent进行嵌套查询

时间:2013-08-08 04:18:53

标签: laravel laravel-4 eloquent

我在我的位置模型中有这种关系:

public function special_users() {
    return $this->users()
    ->where('type_id', '=', '2')
    ->orWhere('type_id', '=', 'null');
}

但我想要的是其中type_id = 2的用户和其中type_id = null的用户,只有当该位置没有用户且type_id = 2时才会使用。

这可能吗?

2 个答案:

答案 0 :(得分:0)

你的问题是关于DBMS的;不是关于Laravel。

通常这些类型的查询是通过查询type_id = 2来执行的。如果没有找到记录,只需触发第二个查询,其中你获取type_id = 0.

答案 1 :(得分:0)

我设计了一个解决方案。所以对于有类似问题的人来说,就是这样。我相信它的执行成本可能会降低,并希望能够如此表现出来,但现在,享受吧。

class Location extends Eloquent {
    protected $table = 'locations';

    public function users() {
        return $this->belongsToMany('User')->withTimestamps()->withPivot(['type_id']);
    }

    public function chef_users() {
        return $this->users()->where('type_id', '2');
    }
}

class DishController extends BaseController {
    $chef_locations = Location::with('chef_users')->get();
    foreach ($chef_locations as $cl) {
        foreach ($cl->chef_users as $cu) {
            $chef_user_ids[] = $cu->id;
        }
    }

    $locations = Location::with(
        array('users' => function($lu_query) use($chef_user_ids) {
            $lu_query->where('type_id', '2');
            $lu_query->orWhere(function($nested_query) use($chef_user_ids) {
                $nested_query->whereNull('type_id');
                $nested_query->whereNotIn('user_id', $chef_user_ids);
            });
        })
    )
}