如何使用多个数组条件从 laravel 中的 table 检索数据
How can I retrieve data from a table in laravel with multiple array conditions
我正在电子商务网站中应用搜索过滤器。在这里,客户可以选择各种领域,如颜色、形状、价格、对称性、抛光、净度和其他各种东西。
当客户选择任何选项时,它应该添加到他拥有的最后一个选项 selected.So he/she 可能具有必须获取和显示的条件组合。
对于一个数组条件,我可以在 laravel 中使用 whereIn 但对于多个数组条件,我应该 use.Im 不确定哪个数组为空。
这是我的过滤器代码:-
public function Filter(Request $request)
{
$conditions = array();
if($request->isMethod('post')) {
$data = array_filter($request->all());
$shapes = array();
$amount = array();
$carat = array();
$cut = array();
$color = array();
$clarity = array();
$cerifying_agency = array();
$flourscence = array();
$polish = array();
$symmetry = array();
// $conditions=array();
if(isset($data['shape'])){
$shapes = $data['shape'];
}
if(isset($data['amount'])){
$amount = $data['amount'];
}
if(isset($data['carat'])){
$carat = $data['carat'];
}
if(isset($data['cut'])){
$cut = $data['cut'];
}
if(isset($data['color'])){
$color = $data['color'];
}
if(isset($data['clarity'])){
$clarity = $data['clarity'];
}
if(isset($data['ca'])){
$cerifying_agency = $data['ca'];
}
if(isset($data['fl'])){
$flourscence = $data['fl'];
}
if(isset($data['polish'])){
$polish = $data['polish'];
}
if(isset($data['symmetry'])){
$symmetry = $data['symmetry'];
}
}
}
我附上了 UI 的快照和在过滤函数数组中调用的 ajax 的数据格式:-Sorry I couldnt embed the picture as Whosebug is not allowing me to do so
好吧,您可以像常规一样使用这些条件 whereIn
。
例如:
$posts = Post::latest();
if($request->has('carat'))
{
$posts->whereIn('carat', $request->input('carat');
}
if($request->has('shape'))
{
$posts->whereIn('shape', $request->input('shape'));
}
....
$posts = $posts->get();
请务必先验证您的条件。
您可以使用类似这样的函数:
function appendFilter($query, $array, $fieldName){
return $query->where(function($query) use ($array, $fieldName) {
$query->whereIn($fieldName, $array)->orWhereRaw(empty($array) ? "true" : "false");
});
}
你可以这样使用它:
$productQuery = DB::table("products");
$productQuery = appendFilter($productQuery, $shapes, "shape");
$productQuery = appendFilter($productQuery, $otherFilters, "otherField");
$results = $productQuery->get();
这个函数的作用是它在嵌套的位置附加 执行 WhereIn 的第一部分,但它还有 orWhereRaw 附加原始 "true"数组为空时的值(否则为假)
因此,如果您的过滤值数组为空,它不会影响 select 中的值。
我正在电子商务网站中应用搜索过滤器。在这里,客户可以选择各种领域,如颜色、形状、价格、对称性、抛光、净度和其他各种东西。 当客户选择任何选项时,它应该添加到他拥有的最后一个选项 selected.So he/she 可能具有必须获取和显示的条件组合。 对于一个数组条件,我可以在 laravel 中使用 whereIn 但对于多个数组条件,我应该 use.Im 不确定哪个数组为空。
这是我的过滤器代码:-
public function Filter(Request $request)
{
$conditions = array();
if($request->isMethod('post')) {
$data = array_filter($request->all());
$shapes = array();
$amount = array();
$carat = array();
$cut = array();
$color = array();
$clarity = array();
$cerifying_agency = array();
$flourscence = array();
$polish = array();
$symmetry = array();
// $conditions=array();
if(isset($data['shape'])){
$shapes = $data['shape'];
}
if(isset($data['amount'])){
$amount = $data['amount'];
}
if(isset($data['carat'])){
$carat = $data['carat'];
}
if(isset($data['cut'])){
$cut = $data['cut'];
}
if(isset($data['color'])){
$color = $data['color'];
}
if(isset($data['clarity'])){
$clarity = $data['clarity'];
}
if(isset($data['ca'])){
$cerifying_agency = $data['ca'];
}
if(isset($data['fl'])){
$flourscence = $data['fl'];
}
if(isset($data['polish'])){
$polish = $data['polish'];
}
if(isset($data['symmetry'])){
$symmetry = $data['symmetry'];
}
}
}
我附上了 UI 的快照和在过滤函数数组中调用的 ajax 的数据格式:-Sorry I couldnt embed the picture as Whosebug is not allowing me to do so
好吧,您可以像常规一样使用这些条件 whereIn
。
例如:
$posts = Post::latest();
if($request->has('carat'))
{
$posts->whereIn('carat', $request->input('carat');
}
if($request->has('shape'))
{
$posts->whereIn('shape', $request->input('shape'));
}
....
$posts = $posts->get();
请务必先验证您的条件。
您可以使用类似这样的函数:
function appendFilter($query, $array, $fieldName){
return $query->where(function($query) use ($array, $fieldName) {
$query->whereIn($fieldName, $array)->orWhereRaw(empty($array) ? "true" : "false");
});
}
你可以这样使用它:
$productQuery = DB::table("products");
$productQuery = appendFilter($productQuery, $shapes, "shape");
$productQuery = appendFilter($productQuery, $otherFilters, "otherField");
$results = $productQuery->get();
这个函数的作用是它在嵌套的位置附加 执行 WhereIn 的第一部分,但它还有 orWhereRaw 附加原始 "true"数组为空时的值(否则为假) 因此,如果您的过滤值数组为空,它不会影响 select 中的值。