我正在尝试创建一个销售过滤页面,用户可以在其中设置dateRange,如果他们想要,他们也可以将货币和客户名称设置为过滤器的一部分。
public function filterSale(Request $request)
{
$customer = \DB::table('companies')->where('category', '=', 'customer')->pluck('comp_name', 'id')->all();
$currencies = \DB::table('currencies')->orderBy('default', 'desc')->pluck('acronym', 'id')->all();
$currency = $request['currency_id'];
$company = $request['company_id'];
if ($request->from_date != '' && $request->to_date != '' || $request['currency_id'] != ''
|| $request['company_id'] != '') {
$sales = Sales::where('publish', '=', 1)
->whereBetween('created_at', array($request->from_date, $request->to_date))
->where('currency_id', '=', $currency)
->where('company_id', '=', $company)
->get();
return view('reports.salesReport', compact('sales', $sales))
->with('currency', $currency)
->with('company', $company)
->with('customer', $customer)
->with('currencies', $currencies);
}
}
我想要实现的是,如果用户设置dateRage并将货币和客户留空,则数据应显示所有数据,无论其货币和所属的客户如何。
或客户+日期记录或货币+ dateRange或货币+客户+日期。
我怎么能实现这一目标?
非常感谢你提前!
有几种方法可以做到这一点。
第一个是将if条件包含在if语句中:
if ($request->from_date != '' && $request->to_date != '') {
$salesQuery = Sales::where('publish', 1)
->whereBetween('created_at', [$request->from_date, $request->to_date]);
if ($request->input('current_id')) {
$salesQuery->where('currency_id', $request->input('currency_id'));
}
if ($request->input('company_id')) {
$salesQuery->where('company_id', $request->input('company_id'));
}
$sales = $salesQuery->get();
}
或者,您可以使用when():
if ($request->from_date != '' && $request->to_date != '') {
$sales = Sales::where('publish', 1)
->whereBetween('created_at', [$request->from_date, $request->to_date])
->when($request->input('current_id'), function ($query) use ($request) {
$query->where('currency_id', $request->input('currency_id'));
})
->when($request->input('company_id'), function ($query) use ($request) {
$query->where('company_id', $request->input('company_id'));
})
->get();
}
最后,将你的return语句改为仅使用compact()
,这样如果没有包含日期就不会抛出错误,这意味着你的整个控制器方法看起来像:
public function filterSale(Request $request)
{
$customer = \DB::table('companies')->where('category','customer')->pluck('comp_name', 'id');
$currencies = \DB::table('currencies')->orderBy('default', 'desc')->pluck('acronym', 'id');
if ($request->from_date != '' && $request->to_date != '') {
$sales = Sales::where('publish', 1)
->whereBetween('created_at', [$request->from_date, $request->to_date])
->when($request->input('current_id'), function ($query) use ($request) {
$query->where('currency_id', $request->input('currency_id'));
})
->when($request->input('company_id'), function ($query) use ($request) {
$query->where('company_id', $request->input('company_id'));
})
->get();
}
return view('reports.salesReport', compact('sales', 'currency', 'company', 'customer', 'currencies'));
}
注意你不需要在all()
之后调用pluck()
。