Laravel:根据输入查询。如果输入为空,请全部输入

时间:2014-11-24 15:20:05

标签: mysql laravel laravel-4 eloquent

我有一个日历(FullCalendar),用户可以根据一些参数(Tutor Secondary Tutor,Lesson,Location)筛选结果。当用户对查询进行更改时,它会触及以下代码。

我遇到的问题是' OR'。我真正想要的是IF输入为null然后全部。

如果用户{获取所有课程,其中lead_tutor_id = 1且secondary_tutors_id = 1} 如果用户和位置{获取用户如上所述的课程,但是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();

我一直在使用查询范围,但如果将NULL值传递给它,这似乎会失败。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

您唯一需要记住的是在正确的位置插入“OR”。所以,如果没有插入或不插入,请检查是否是第一件事,如果没有,那么就是' OR'在它面前。

希望有足够的信息来帮助你。

答案 1 :(得分:0)

根据Saint Genius的建议,我有这个工作:

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