我的 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 的用户。
这可能吗?
您的问题是关于 DBMS 的;不是关于 Laravel。
通常这些类型的查询是通过查询 type_id = 2 来执行的。如果没有找到记录,只需在获取 type_id = 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);
});
})
)
}