我已经应用了一个laravel构建器来过滤用户在表单中的搜索输入,但它并不是最佳的。这是我的情景:
第一个输入中的是自定义查询搜索,其中包含以下构建器。
return $builder->where('city', 'LIKE', '%' . $value . '%')
->orWhere('first_name', 'LIKE', '%' . $value . '%')
->orWhere('middle_name', 'LIKE', '%' . $value . '%')
->orWhere('last_name', 'LIKE', '%' . $value . '%');
通过以下代码过滤3个下拉菜单:
return $builder->where('location', $value); // <-- for "selecteer locatie"
return $builder->where('level', $value); // <-- for "selecteer richting"
return $builder->where('graduation', $value); // <-- for "selecteer diplomajaar"
$ value是用户的输入。
现在每当我按照3个下拉选项进行过滤时,它就像魔术一样。每当我尝试将它与第一个过滤器的查询结合使用时,它会显示比我实际想要的结果更多的结果。
所以第一个查询给出了一个OR语句,实际上就是bug。我想在我可以运行的构建器中放置一个RAW SQL语句
"WHERE `city` LIKE %" . $value . "%
OR `first_name` LIKE %" . $value . "
OR `middle_name` LIKE %" . $value . "
OR `last_name` LIKE %" . $value . "
在这些符号之间( 'statement' )
有没有办法可以单独运行构建器或者如何在laravel 5.3构建器中输入原始SQL语句?
如果您需要更多信息,请询问。
编辑:我的问题不够明确!见下面的描述。
我正在使用Builder类在我的表单中创建我的SQL过滤器。每当我运行高级搜索并转储我的Builder时,我会在+ where子句中获得一个带有以下数组的Builder对象:
+wheres: array:7 [▼
0 => array:5 [▼
"type" => "Basic"
"column" => "city"
"operator" => "LIKE"
"value" => "%hof%"
"boolean" => "and"
]
1 => array:5 [▼
"type" => "Basic"
"column" => "first_name"
"operator" => "LIKE"
"value" => "%hof%"
"boolean" => "or"
]
2 => array:5 [▼
"type" => "Basic"
"column" => "middle_name"
"operator" => "LIKE"
"value" => "%hof%"
"boolean" => "or"
]
3 => array:5 [▼
"type" => "Basic"
"column" => "last_name"
"operator" => "LIKE"
"value" => "%hof%"
"boolean" => "or"
]
4 => array:5 [▼
"type" => "Basic"
"column" => "location"
"operator" => "="
"value" => "Franeker"
"boolean" => "and"
]
5 => array:5 [▼
"type" => "Basic"
"column" => "level"
"operator" => "="
"value" => "MAVO"
"boolean" => "and"
]
6 => array:5 [▼
"type" => "Basic"
"column" => "graduation"
"operator" => "="
"value" => "1992"
"boolean" => "and"
]
]
因为我使用OR运算符与city
,first_name
,middle_name
或last_name
进行比较,所以我应该 4 where where子句而不是7 即可。这是因为Builder将第一个输入中调用的OR语句看作AND语句。
答案 0 :(得分:1)
我通过替换它来解决它:
return $builder->where('city', 'LIKE', '%' . $value . '%')
->orWhere('first_name', 'LIKE', '%' . $value . '%')
->orWhere('middle_name', 'LIKE', '%' . $value . '%')
->orWhere('last_name', 'LIKE', '%' . $value . '%');
进入这个:
return $builder->where( function($query) use ($value){
$query->where('city', 'LIKE', '%' . $value . '%')
->orWhere('first_name', 'LIKE', '%' . $value . '%')
->orWhere('middle_name', 'LIKE', '%' . $value . '%')
->orWhere('last_name', 'LIKE', '%' . $value . '%');
});
编辑:以下+ where子句在die并转储Builder类时被转储
+wheres: array:4 [▼
0 => array:3 [▼
"type" => "Nested"
"query" => Builder {#216 ▶}
"boolean" => "and"
]
1 => array:5 [▼
"type" => "Basic"
"column" => "location"
"operator" => "="
"value" => "Franeker"
"boolean" => "and"
]
2 => array:5 [▼
"type" => "Basic"
"column" => "level"
"operator" => "="
"value" => "MAVO"
"boolean" => "and"
]
3 => array:5 [▼
"type" => "Basic"
"column" => "graduation"
"operator" => "="
"value" => "1992"
"boolean" => "and"
]
]
在数组索引0的嵌套Builder类中插入了OR语句。
答案 1 :(得分:0)
你的答案应该正确地分组。
对于&#34;我如何在Laravel 5.3构建器中输入原始SQL语句?&#34;
DB::statement($rawStatement)
确保将值作为第二个参数绑定到statement
,您也可以使用
DB::statement(DB::raw($rawStatement))
还有
$query->whereRaw("city LIKE %{$value}%")
这对于输入某些查询非常有用,但无法解决嵌套查询问题。
如果你想把所有的生物都做好,你就必须采取以下措施:
$query->whereRaw($mainQuery)
->setBindings([$city, $first_name, $middle_name, $last_name])
主查询的位置如下:
"(city LIKE ? OR first_name LIKE ? OR middle_name LIKE ? OR last_name LIKE ?)"
然后,您可以将原始筛选查询附加到该字符串
"AND location = ?"