我的用户需要能够使用5个不同的参数查询数据库。我认为处理此问题的最佳方法是使用查询范围。然后将查询范围链接在一起。但我无法弄清楚如何根据未知数量(0-5)的搜索参数来做到这一点。
我使用了一个特定的搜索参数。
$thirtyDaysAgo = Carbon::now()->subDays(30)->toDateString();
$orders = Order::DateRange($thirtyDaysAgo)->get();
return view('orders/browse', compact('orders'));
任何帮助将不胜感激。
修改:更多信息
参数从表单发布到页面:
$input = Input::all();
dd($input);
产量
array:7 [▼
"_token" => "MX4gVmbON56f9Aa88kgn2Re68GoDrtDeR6phEJ30"
"orderType" => "1"
"orderNumber" => "1"
"timePeriod" => "0"
"orderStatus" => "0"
"sku" => ""
"customer" => "0"
]
编辑:添加查询范围
public function scopeDateRange($query, $range){
return $query->where('created_at', '>=', $range);
}
public function scopeOrderNumber($query, $orderNumber){
return $query->whereOrderNumber($orderNumber);
}
public function scopeCustomer($query, $customer){
return $query->whereCustomerId($customer);
}
public function scopeStatus($query, $status){
if($status == 'active'){
return $query->where('orderStatus_id', '!=', 15)->where('orderStatus_id', '!=', 10);
}elseif($status == 'complete'){
return $query->whereOrderStatusId(15);
}elseif($status == 'cancelled'){
return $query->whereOrderStatusId(10);
}
}
答案 0 :(得分:2)
是的,你可以,只需循环用户输入字段,例如:
//你现在就拥有这个,所以在调用get之前你可以链接 $ thirtyDaysAgo = Carbon :: now() - > subDays(30) - > toDateString();
// Remove the get call
$order = Order::DateRange($thirtyDaysAgo); // Or use Order::query()
// Loop other fields (exclude fields which are not required in query)
foreach(Request::except(['_token', 'other_field_name']) as $field => $value)
{
// Make sure $field (form fields) match with database filed names
$order->where($field, $value);
}
$result = $order->get(); // Run the query and get the result
这是一个想法,您可能需要根据需要进行调整以使其适合。您可以通过yourelf尝试或发布最相关的信息。这不是使用scopeMethods
,但您可以这样做以获得您的目标。
答案 1 :(得分:2)
从它的外观来看,您只想检查您的参数是否为空,如果是,您只需返回查询而不执行范围检查:
public function scopeDateRange($query, $range){
if (!empty($range)) {
return $query->where('created_at', '>=', $range);
}
else {
return $query;
}
}
然后,您可以将它们全部链接在一起,范围函数将挑选出是否自己过滤查询。
$orders = Order::dateRange($range)->orderNumber($orderNumber)->customer($customer)->status($status)->get();