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

Php 如果所选日期介于两个日期之间,如何从查询中获取结果?,php,mysql,database,laravel,eloquent,Php,Mysql,Database,Laravel,Eloquent,我正在尝试获取以下查询的结果:返回在选定日期可用的用户。用户选择了不可用的时间,该时间存储在“availabilities”表中,表中有开始日期时间和结束日期时间。 以下是我一直在尝试但没有成功的东西。。。我不断地让错误的用户返回,如果他们设置了多个不可用时间段,它也会返回他们 试试看 下面是在try#1案例中执行的mysql查询: 蚂蚁知道哪里出了问题或者如何解决这个问题吗 编辑完整查询 $photographers_available = Photographer::where('is_p

我正在尝试获取以下查询的结果:返回在选定日期可用的用户。用户选择了不可用的时间,该时间存储在“availabilities”表中,表中有开始日期时间和结束日期时间。 以下是我一直在尝试但没有成功的东西。。。我不断地让错误的用户返回,如果他们设置了多个不可用时间段,它也会返回他们

试试看

下面是在try#1案例中执行的mysql查询:

蚂蚁知道哪里出了问题或者如何解决这个问题吗

编辑完整查询

$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();
$摄影家可用=摄影家::其中('is_摄影家','=','1')
->whereHas('studioAddress',function($q)use($city\u id)
{
$q->where('city\u id','=',$city\u id);
})
->或者wherehas('user',function($q)use($city\u id)//TK可以简化为'user.address'
{ 
$q->whereHas('address',function($q)use($city\u id)
{
$q->where('city\u id','=',$city\u id);
});
})
->何处有('StypeStapper',函数($q)使用($stype)
{
$q->where('shooting\u type\u id','=',$stype);
})
->其中(函数($q)使用($selected\u date\u time){
$q->whereHas('availabilities',function($q)use($selected\u date\u time)
{
$q->where('unavailable\u start\u date','>',$selected\u date\u time)
->其中('unavailable\u end\u date','>',$selected\u date\u time);
})->或wherehas('availabilities',函数($q)use($selected\u date\u time)
{

$q->where('unavailable\u start\u date',”试试这个对我来说很好用

如果使用雄辩的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);  
})
User::Where(函数($query)use($selected\u date\u time)
{
$query->where('unavailable\u start\u date','>',$selected\u date\u time);
$query->where('unavailable\u end\u date','>',$selected\u date\u time);
})
->orWhere(函数($query)
{
$query->where('unavailable\u start\u date','
User::whereHas('availabilities',函数($q)use($dt){
$q->where('unavailable\u start\u date','','$dt);
},“=”,0)->get();
因此,我们在某种程度上扭转了这一局面。我们在Where Has中设置查询,以查找此范围内的可用性、不可用性。因此,我们在某种程度上查询所有不可用的记录。然后,通过使用Where Has的其他参数,我们只抓取不具有与此条件匹配的关系的用户(
“=”,0


因此,无论有多少可用性记录,属于此时间范围的任何具有此关系的用户都不会返回。如果其中任何一个符合条件,他们将无法通过筛选。

编辑tldr;记住使用嵌套
where
for
或任何
方法。除此之外,@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();
因为,正如我们在这里看到的:

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

您需要嵌套的
或where
,因为(可能)一个全局范围。

它不应该对我起作用,我需要加载关系“可用性”。这太疯狂了,第二个用户总是出现!不是第一个用户想的!当我手动测试出现的用户时,我只通过测试日期>或

得到逻辑部分为假。始终显示相同:什么格式是不可用的可用的开始日期列以及您使用的$dt格式是什么?两种格式都相同:字符串(19)“2014-11-13 11:00:00”当相互比较时,我得到了很好的答案->查看我的问题编辑供阅读者使用,请查看下面的@jarek评论。需要嵌套orWhere,然后它就可以完美地运行此解决方案!我是否需要更新此答案,下面的内容有点让人困惑:)。该死的,它返回了错误的用户…这不容易!你的第一个where子句没有条件?我没有详细说明你的整个故事,所以我不知道这意味着什么,但这部分显然是错误的(
x和y或z
而不是
x和(y或z)
)是的,
where
没有条件,因为它是用来嵌套其他
where
的。所以,总结一下您的问题-您有
不可用的
表(暂时忘记名称,我指的是它的用途)您想获取在给定日期内可用的用户,对吗?对,my table availabilities为用户提供了一个外键,并提供了用户不可用的开始和结束日期。好的,刚刚意识到上一个查询可能有冲突。请耐心等一分钟,我将在问题中删除整个查询。@jarek full query现在在这个问题上,你可以看到我在做3,在那之前,出于不同的原因,但到目前为止,它返回了正确的东西swell,如果是这样的话,@lagbox已经给了你正确的解决方案。除非你最后指的是其他东西。。
$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();
 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')
User::whereHas('availabilities', function ($q) use ($dt) {
    $q->where('unavailable_start_date', '<=', $dt)
      ->where('unavailable_end_date', '>', $dt);
}, '=', 0)->get();
$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();
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