我有一个日历(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值传递给它,这似乎会失败。
非常感谢任何帮助。提前谢谢。
答案 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();