Mysql Laravel:基于输入的查询。如果输入为空,则获取全部

Mysql Laravel:基于输入的查询。如果输入为空,则获取全部,mysql,laravel,laravel-4,eloquent,Mysql,Laravel,Laravel 4,Eloquent,我有一个日历(FullCalendar),用户可以根据几个参数(导师、二级导师、课程、地点)筛选结果。当用户对查询进行更改时,会出现以下代码 我遇到的问题是“或”。我真正想要的是一个IF输入为null然后get all 如果用户{获取lead_tutors_id=1和secondary_tutors_id=1的所有课程} 如果用户和位置{获取课程,其中用户如上所述,但位置_id=3} 等等等等 那么,如果只设置了一个或两个过滤器,有没有办法回过头来获得所有结果 $current_events =

我有一个日历(FullCalendar),用户可以根据几个参数(导师、二级导师、课程、地点)筛选结果。当用户对查询进行更改时,会出现以下代码

我遇到的问题是“或”。我真正想要的是一个IF输入为null然后get all

如果用户{获取lead_tutors_id=1和secondary_tutors_id=1的所有课程} 如果用户和位置{获取课程,其中用户如上所述,但位置_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 = isset($var) ? $var : '';
$query .= isset($othervar) ? $othervar : '';

whereBetween(*)->orderBy(*)->whereRaw($query)
您需要记住的唯一一件事是在正确的位置插入'OR'。因此,请检查它是否是第一件要插入的东西,如果不是,请在它前面加上“或”


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

在听取了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();

1.您不需要在first
where
,2中使用闭包。您根本不需要
whereRaw
,3。您可能需要关闭所有
的位置,4。到底是什么问题?查询范围不会因NULL而失败,所以请重新表述您的问题。感谢Saint Genius,是的,这很好。但是,如果我混合并或查询中断:“lead_tutors_id=1或secondary_tutors_id=1,lesson_id=1,location_id=1”。战斗第二回合!再次感谢。