【问题标题】:Mysql / Laravel Logical test returning false but query returning trueMysql / Laravel 逻辑测试返回假但查询返回真
【发布时间】:2014-11-12 03:30:36
【问题描述】:

我无法弄清楚为什么 mysql 查询在不应该返回结果时返回结果,事情是这样的: 我正在尝试为在一段时间内不可用的用户返回结果。 所以我的表可用性不可用开始日期时间和不可用结束日期时间与用户的外键。 现在我已经选择了我要测试的日期时间。

这里是查询:

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

这是手动对返回的用户进行的逻辑测试的结果,以查看测试是否错误或查询中的问题:

    selected string(19) "2014-11-13 10:30:00"

unavailableStart string(19) "2014-11-12 11:30:00"

unavailableEnd string(19) "2014-11-18 11:00:00"

$undateS > $selected_date_time : result = bool(false)
$undateE > $selected_date_time : result = bool(true)  ==> two above && return false
$undateS < $selected_date_time : result = bool(true)
$undateE < $selected_date_time : result = bool(false)  ==> two above && return false

如您所见,OR 测试将返回 FALSE,这意味着该用户不应出现在结果中...奇怪的是,我还有另一个用户也被设置为在类似的时间段内不可用,他不会在结果中返回.....

我在这方面做错了什么?

编辑 SQL 执行:

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

感谢您的帮助!

【问题讨论】:

标签: php mysql datetime laravel eloquent


【解决方案1】:

似乎用户模型没有触发正确的 sql 脚本。您可以使用此工具检查 Eloquent 模型究竟触发了哪些 sql,barryvdh/laravel-debugbar

【讨论】:

  • 我可以通过 dd(DB::getQueryLog()); 看到脚​​本;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 2017-04-25
  • 2014-10-05
  • 2015-04-02
相关资源
最近更新 更多