使用Laravel中的另一个关联字段为dateRange创建条件

问题描述 投票:0回答:1

我正在尝试创建一个销售过滤页面,用户可以在其中设置dateRange,如果他们想要,他们也可以将货币和客户名称设置为过滤器的一部分。

enter image description here

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或货币+客户+日期。

我怎么能实现这一目标?

非常感谢你提前!

laravel if-statement condition
1个回答
2
投票

有几种方法可以做到这一点。

第一个是将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()

© www.soinside.com 2019 - 2024. All rights reserved.