laravel 查询:orWhere:双重条件

Posted

技术标签:

【中文标题】laravel 查询:orWhere:双重条件【英文标题】:laravel query: orWhere: double condition 【发布时间】:2015-02-26 18:24:35 【问题描述】:

我有以下查询,但没有给我预期的结果:

    $query = $query->join('events_dates', function($join) use ($data) 
                $join->on('events.id', '=', 'events_dates.event_id')
                        ->where('events_dates.start_date', "<=", date_format(date_create($data['date_end']), "Y-m-d"))
                        ->where('events_dates.end_date', '>=', date_format(date_create($data['date_start']), "Y-m-d"))
                        ->orWhere('recurrent', "=", 1)
                        ->where((strtotime($data["date_start"]) - strtotime('event_dates.start_date')) % ('events_dates.repeat_interval' * 86400), '=', 0); 
            ); 

此查询中有 4 个 where 子句。 要求是要么执行前两个 where 子句,要么执行最后两个,具体取决于 recurrentfield。

php 返回错误division by zero,因为当recurrent0 时不应执行最后一个Where 子句。

有什么建议吗?

【问题讨论】:

您不能在 where 子句中的 SQL 列上使用像 strtotime 这样的 PHP 函数。可以用 SQL 写吗? 可能,必须调查一下。 Laravel 似乎接受它,但我得到一个除以零的错误。不先评估吗? 嗯,刚刚意识到这种方法根本行不通。 where期望第一个参数是数据库中的字段名称,所以我还没有找到另一种解决方法。最终我可以将所有经常发生的事件隔离到一个单独的表中,但我觉得这有点傻。 【参考方案1】:

我不知道你的确切目标,也不知道你的数据库是什么样的,所以这只是一个疯狂的猜测:

$query = $query->join('events_dates', function($join) use ($data) 
            $join->on('events.id', '=', 'events_dates.event_id')
                    ->where('events_dates.start_date', "<=", date_format(date_create($data['date_end']), "Y-m-d"))
                    ->where('events_dates.end_date', '>=', date_format(date_create($data['date_start']), "Y-m-d"))
                    ->orWhere('recurrent', "=", 1)
                    ->whereRaw('DATEDIFF(?, event_dates.start_date) % event_dates.repeat_interval = 0', array($data['date_start']));

更新

这可能有助于两个日期之间的部分

->where('events_dates.start_date', '<=', new Carbon($data['date_end']))
->where('events_dates.end_date', '>=', new Carbon($data['date_start']))

【讨论】:

我最终将经常性事件迁移到一个单独的表中,并最终加入结果。我运行以下查询:$query = $query-&gt;join('events_dates_recurrent', 'events.id', '=', 'events_dates_recurrent.event_id') -&gt;whereRaw("ABS(DATEDIFF('" . $input_datestart . "', CAST(events_dates_recurrent.start_date AS DATE)) % events_dates_recurrent.repeat_interval) = 0"); 目前仍在努力检查给定开始/结束日期之间的所有日期。我会接受你在路上帮助我的回答。 谢谢。这是一场斗争,我不是特别擅长查询。我发布了一个新问题:***.com/questions/27713474/…。如果你碰巧知道答案,我也会接受。

以上是关于laravel 查询:orWhere:双重条件的主要内容,如果未能解决你的问题,请参考以下文章

laravel多字段模糊查找,用when+orwhere时其他条件失效

laravel多字段模糊查找,用when+orwhere时其他条件失效

laravel多字段模糊查找,用when+orwhere时其他条件失效

Laravel Eloquent Query 使用 Where、With、Where 和 orWhere 条件

如何在 laravel 中使用 orWhere() 和 where

十三PHP框架Laravel学习笔记——构造器的 where 派生查询