我想查询一个雄辩的模型。目前,这就是它的完成方式:
$query = People::query()->where('something', '=', $something');
我想为用户添加3个下拉菜单,以选择他或她想要找到的人的类型。这些下拉列表为sex
,hair color
和body type
,所有这些都是可选的。如果填写完毕,这些值也将出现在查询字符串中。
这就是我试图做的事情:
if (Input::has('sex')) {
$query = People::query()->where('sex', '=', $sex);
}
else
if (Input::has('sex') && Input::has('haircolor')) {
$query = People::query()->where('sex', '=', Input::get('sex'))->where('hair_color', '=', Input::get('haircolor'));
}
else
if (Input::has('sex') && Input::has('bodytype')) {
$query = People::query()->where('sex', '=', Input::get('sex'))->where('body_type', '=', Input::get('bodytype'));
}
else
if (Input::has('sex') && Input::has('haircolor') && Input::has('bodytype')) {
$query = People::query()->where('sex', '=', Input::get('sex'))->where('hair_color', '=', Input::get('haircolor'))->where('body_type', '=', Input::get('bodytype'));
}
else {
$query = People::query();
}
除了非常丑陋的意大利面条代码之外,其主要问题是第一个条件几乎总是匹配,所以它不准确。
有一种简单的方法吗?
答案 0 :(得分:0)
这可以做得更简单。只需根据您的查询有条件地添加数据:
$query = People::query();
if(Input::has('sex')){
$query->where('sex', Input::get('sex'));
}
if(Input::has('bodytype')){
$query->where('body_type', Input::get('bodytype'));
}
if(Input::has('haircolor')){
$query->where('hair_color', Input::get('haircolor'));
}
$results = $query->get();
一些注意事项:
query()
只有在您想要开始时才需要。对模型的新查询,但没有任何内容(地点,顺序,限制等)适用。您可以毫无问题地People::where(...)
where语句中的=
可以省略。如果只传递两个参数,Laravel将选择=
作为默认运算符
如果您将输入参数和数据库列命名为相同,您甚至可以执行以下操作:
$filters = Input::only('sex', 'body_type', 'hair_color');
$query = People::query();
foreach($filters as $key => $value){
$query->where($key, $value);
}
$results = $query->get();
答案 1 :(得分:0)
$query = People::query();
if (Input::has('sex')) {
$query = $query->andWhere('sex', '=', $sex);
}
if (Input::has('haircolor')) {
$query = $query->andWhere('hair_color', '=', Input::get('haircolor'));
}
if (Input::has('bodytype')) {
$query = $query->andWhere('body_type', '=', Input::get('bodytype'));
}
您不必实施所有情况