我正在尝试获取以下查询的结果:返回在选定日期可用的用户。用户已选择不可用的时间,并将其与开始日期时间和结束日期时间一起存储在“可用性”表中。这是我一直没有成功尝试的事情...我一直在找回错误的用户,并且如果他们设置了多个不可用时间段,它也会返回他们。
尝试#1
User::whereHas('availabilities', function($q)use($selected_date_time)
{
$q->where('unavailable_start_date', '>', $selected_date_time)
->where('unavailable_end_date', '>', $selected_date_time);
})->orWhereHas('availabilities', function($q)use($selected_date_time)
{
$q->where('unavailable_start_date', '<', $selected_date_time)
->where('unavailable_end_date', '<', $selected_date_time);
})->with('availabilities')->get();
尝试#2
User::whereHas('availabilities', function($q)use($selected_date_time)->whereHas('availabilities', function($q)use($selected_date_time)
{
$q->whereRaw('? NOT BETWEEN `unavailable_start_date` AND `unavailable_end_date`', [$selected_date_time]);
})->get();
这是在try#1情况下执行的mysql查询:
select * from `users` where `is_user` = ? and (select count(*) from `availabilities` where `availabilities`.`user_id` = `users`.`id` and `unavailable_start_date` > ? and `unavailable_end_date` > ?) >= 1 or (select count(*) from `availabilities` where `availabilities`.`user_id` = `users`.`id` and `unavailable_start_date` < ? and `unavailable_end_date` < ?) >= 1
约会的日期:
selected string(19) "2014-11-13 11:00:00"
unavailableStart string(19) "2014-11-12 11:30:00"
unavailableEnd string(19) "2014-11-18 11:00:00"
蚂蚁知道出了什么问题或如何解决这个问题?
编辑完整查询
$photographers_available = Photographer::where('is_photographer', '=', '1')
->whereHas('studioAddress', function($q)use($city_id)
{
$q->where('city_id', '=', $city_id);
})
->orWhereHas('user', function($q)use($city_id) // TK could reduce to 'user.address' I think
{
$q->whereHas('address', function($q)use($city_id)
{
$q->where('city_id', '=', $city_id);
});
})
->whereHas('stypesPhotographer', function($q)use($stype)
{
$q->where('shooting_type_id', '=', $stype);
})
->where(function ($q) use ($selected_date_time) {
$q->whereHas('availabilities', function($q)use($selected_date_time)
{
$q->where('unavailable_start_date', '>', $selected_date_time)
->where('unavailable_end_date', '>', $selected_date_time);
})->orWhereHas('availabilities', function($q)use($selected_date_time)
{
$q->where('unavailable_start_date', '<', $selected_date_time)
->where('unavailable_end_date', '<', $selected_date_time);
});
})
->with('availabilities')
->get();
经过思考,会导致错误的or或在哪里?
谢谢!
User::whereHas('availabilities', function ($q) use ($dt) {
$q->where('unavailable_start_date', '<=', $dt)
->where('unavailable_end_date', '>', $dt);
}, '=', 0)->get();
因此,我们在某种程度上扭转了这一局面。我们在其中必须查找范围内的可用性和不可用性的地方设置查询。因此,我们正在查询所有不可用的记录(以某种方式)。然后,通过使用whereHas('=', 0
)的其他参数,仅捕获不具有符合此条件的关系的用户。
因此,无论具有多少可用性记录,任何属于该时间范围的具有这种关系的用户都不会返回。如果他们中的任何一个合格,他们将不会通过过滤器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句