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

时间:2017-11-07 17:15:27

标签: php laravel laravel-5 laravel-5.5

我正在尝试使用Playeruser - 玩家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...但它不起作用,因为如果用户有日历,它将作为另一个集合返回...

由于

2 个答案:

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