php - Laravel - 在关系中过滤关系数据
php - Laravel - filter relation data inside relation
我正在尝试使用 user
和 calendars
检索 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
不工作,因为:
- 并非每个玩家在日历中都有活动(所以我无法访问
fulldate
attr)
- player
hasMany
日历,所以它作为另一个集合返回,我必须 运行 ->whereNotIn(...
在这个日历集合的每个项目中...
所以,我需要日历为空(可用)的男性玩家和现有日历中没有碰撞的玩家。
我怎样才能做到这一点?我尝试合并 ->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);
});
});
我正在尝试使用 user
和 calendars
检索 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
不工作,因为:
- 并非每个玩家在日历中都有活动(所以我无法访问
fulldate
attr) - player
hasMany
日历,所以它作为另一个集合返回,我必须 运行->whereNotIn(...
在这个日历集合的每个项目中...
所以,我需要日历为空(可用)的男性玩家和现有日历中没有碰撞的玩家。
我怎样才能做到这一点?我尝试合并 ->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);
});
});