0

我的 Location 模型中有这种关系:

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

但我想要的是 type_id = 2 的用户和 type_id = null 的用户,前提是该位置没有 type_id = 2 的用户。

这可能吗?

4

2 回答 2

0

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

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

于 2013-08-10T16:00:11.683 回答
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);
            });
        })
    )
}
于 2013-08-11T19:25:03.027 回答