php - Laravel - 在关系中过滤关系数据

php - Laravel - filter relation data inside relation

我正在尝试使用 usercalendars 检索 Player - Player hasOne 用户和 Player hasMany 日历。 但我只需要男性用户 - 工作正常,然后我必须检查日历冲突 - select 只有没有日历冲突的玩家,查询:

$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 不工作,因为:

所以,我需要日历为空(可用)的男性玩家和现有日历中没有碰撞的玩家。

我怎样才能做到这一点?我尝试合并 ->doesntHave('calendars')->orWhereHas('cale... 但它不起作用,因为如果用户有日历,它会作为另一个集合返回...

谢谢

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);
})

要完成构建器的 API,请使用 https://laravel.com/api/5.2/Illuminate/Database/Eloquent/Builder.html

您需要执行 "sub query",因为您希望发生以下情况之一: 日历为空或日历日期不是特定日期。

所以

Player::where(function($query) use ($forbiddenDatesArray) {
    $query->has('calendars', 0)
          ->orWhereHas('calendars', function($query) use ($forbiddenDatesArray){
              $query->whereNotIn('fullDate', $forbiddenDatesArray);
          });
});