繁体   English   中英

如果所选日期在两个日期之间,如何从查询中获取结果?

[英]How to get results from the query if the selected date is between two dates?

我正在尝试获取以下查询的结果:返回在选定日期可用的用户。 用户已选择不可用的时间,并将其存储在带有开始日期时间和结束日期时间的“可用性”表中。 这是我一直没有成功的尝试...我一直在找回错误的用户,而且如果他们设置了多个不可用时间段,它也会返回他们。

尝试#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 )的其他参数,仅捕获不具有符合此条件的关系的用户。

因此,无论具有多少可用性记录,任何属于该时间范围的具有这种关系的用户都不会返回。 如果他们中的任何一个合格,他们将不会通过过滤器。

编辑tldr; 记住要为orWhatever方法使用嵌套where 除此之外,@ lagbox还为您最初发布的问题提供了正确答案。 完整的解决方案:

$photographers_available =  Photographer::where('is_photographer', '=', '1')
->where(function ($q) use($city_id){
    $q->whereHas('studioAddress', function($q)use($city_id) {
        $q->where('city_id', '=', $city_id);
    })
    ->orWhereHas('user', function($q)use($city_id) {
        $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();

假设您的where子句适合您的情况,这是您需要的:

User::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();

因为,正如我们在这里看到的:

select * from `users` 
  where `is_user` = ? 
  and (...) >= 1 
  // culprit:
  or (...) >= 1

由于(可能是)全局作用域,您需要嵌套或orWhere

试试这个对我来说很好 ...

如果使用雄辩的ORM,请使用:

 User::Where(function($query)  use ($selected_date_time)
{
        $query->where('unavailable_start_date','>',$selected_date_time);    
        $query->where('unavailable_end_date','>',$selected_date_time);  
})
->orWhere(function($query)
{
        $query->where('unavailable_start_date','<',$selected_date_time);    
        $query->where('unavailable_end_date','<',$selected_date_time);  
})

上面是这样的(在我的表中它导致下面的查询)

select * from `equipments` where (`created_at` > '2014-10-29' and `updated_at` > '2014-10-29') or (`created_at` < '2014-10-29' and `updated_at` < '2014-10-29')

评论不起作用...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM