【问题标题】:Laravel: Querying based on Input. If input is empty, get allLaravel:基于输入的查询。如果输入为空,则获取所有
【发布时间】:2014-11-24 15:20:05
【问题描述】:

我有一个日历 (FullCalendar),用户可以在其中根据几个参数(Tutor Secondary Tutor、Lesson、Location)过滤结果。当用户对查询进行更改时,它会点击以下代码。

我遇到的问题是“或”。我真正想要的是一个 IF 输入为空,然后全部获取。

如果用户 { 获取其中lead_tutor_id = 1 和secondary_tutors_id = 1 的所有课程} If User and Location { 获取用户所在位置的课程,但 location_id = 3 } 等等等等。

那么,如果只设置一个或两个过滤器,我有没有办法回退以获得所有结果?

$current_events = Calendar::Where(function($query) use ($start_time, $end_time, $tutor, $location, $lesson)
        {
            $query->whereBetween('date_from', [$start_time, $end_time])->orderBy('date_from')
                ->whereRaw('lead_tutor_id = ?
                            OR secondary_tutors_id = ?
                            OR location_id = ?
                            OR lesson_id = ?',
                            [
                                $tutor, // Input get() for user
                                $tutor, // Input get() for user
                                $location, // Input get() for location
                                $lesson, // Input get() for lesson
                            ]
                         );
        })->with('lessons', 'leadtutor', 'secondarytutor')->get();

我一直在使用 Query Scopes,但是如果将 NULL 值传递给它,这似乎会失败。

非常感谢任何帮助。提前致谢。

【问题讨论】:

  • 1.你不需要在第一个where 关闭,2. 你根本不需要whereRaw,3. 你可能需要关闭所有or wheres,4. 到底是什么问题?查询范围不会因 NULL 而失败,因此请重新表述您的问题。

标签: mysql laravel laravel-4 eloquent


【解决方案1】:

您可以正手构建查询,将其存储在变量中并在构建后使用它。

$query = isset($var) ? $var : '';
$query .= isset($othervar) ? $othervar : '';

whereBetween(*)->orderBy(*)->whereRaw($query)

您需要记住的唯一一件事就是在正确的位置插入“或”。因此,请检查它是否是首先插入的东西,如果不是,则在其前面加上“或”。

希望这些信息对您有所帮助。

【讨论】:

  • 感谢圣天才,是的,这很好。但是,如果我混合 AND 和 OR,查询会中断:'lead_tutor_id = 1 OR secondary_tutors_id = 1 AND course_id = 1 AND location_id = 1'。战斗中的第二回合!再次感谢您。
【解决方案2】:

在圣天才的建议下,我得到了这个工作:

$built_query = [];
isset($lead_tutor) ? $built_query['lead_tutor'] = 'lead_tutor_id = ' . $lead_tutor . ' ' : null;
isset($secondary_tutor) ? $built_query['secondary_tutor'] = 'secondary_tutors_id = ' . $secondary_tutor . ' ' : null;
isset($location_id) ? $built_query['location'] = 'location_id = ' . $location_id : null;
isset($lesson_id) ? $built_query['lesson'] = 'lesson_id = ' . $lesson_id : null;

// Flatten the array so we can create a query and add the word ADD in between each element.
$built_query = implode(" AND ", $built_query);

// Run the query
$current_events = Calendar::whereBetween('date_from', [$start_time, $end_time])->orderBy('date_from')->whereRaw($built_query)->with('lessons', 'leadtutor', 'secondarytutor')->get();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-16
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2019-09-22
    • 1970-01-01
    相关资源
    最近更新 更多