我正在尝试使用Player
和user
- 玩家calendars
用户和玩家hasOne
日历检索hasMany
。
但我只需要男性用户 - 工作正常,然后我必须检查日历冲突 - 只选择没有日历冲突的玩家,查询:
$freeplayers = Player::whereNotIn('id', $playersev)
->with('user','calendars')
->whereHas('user', function ($query) {
$query->where('gender', 'male');
})
->whereHas('calendars', function ($query) use ($event) {
$query->whereNotIn('fulldate', $event->fulldate);
})
->get();
第二个whereHas
无效,因为:
fulldate
attr)hasMany
日历,因此它作为另一个集合返回,我必须在此日历集合的每个项目中运行->whereNotIn(...
... 所以,我需要有空日历(可用)的男性玩家和现有日历中没有碰撞的玩家。
我怎样才能实现这一目标?我试图合并->doesntHave('calendars')->orWhereHas('cale...
但它不起作用,因为如果用户有日历,它将作为另一个集合返回...
由于
答案 0 :(得分:1)
whereNotIn将给定数组的值检查为第二个参数
尝试
->whereHas('calendars', function ($query) use ($event) {
$query->where('fulldate', '!=', $event->fulldate);
})
更新:获取没有日历条目的玩家
->whereHas('calendars', function ($query) use ($event) {
$query->where('fulldate', '!=', $event->fulldate)
->orWhere('fulldate', null);
})
答案 1 :(得分:1)
对于构建器的完整API,请使用https://laravel.com/api/5.2/Illuminate/Database/Eloquent/Builder.html
您需要执行“子查询”,因为您希望发生以下任一情况: 日历为空或日历日期不是特定日期。
所以
Player::where(function($query) use ($forbiddenDatesArray) {
$query->has('calendars', 0)
->orWhereHas('calendars', function($query) use ($forbiddenDatesArray){
$query->whereNotIn('fullDate', $forbiddenDatesArray);
});
});