我可以使用Laravel 5

时间:2015-05-06 17:26:57

标签: php laravel-5 dynamicquery

我的用户需要能够使用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);
    }
}

2 个答案:

答案 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();