Создать условие для dateRange с другими связанными полями в Laravel - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь создать страницу фильтрации продаж, где пользователь может установить 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 и оставил валюту и клиента пустыми, в данных должны были отображаться все данные независимо от их валюты и того, к какому клиенту он принадлежит.

ИЛИ Клиент + дата-график ИЛИ валюта + дата-диапазон ИЛИ валюта + клиент + дата-дата.

как мне этого добиться?

Заранее большое спасибо!

1 Ответ

2 голосов
/ 30 марта 2019

Есть несколько способов сделать это.

Первый - это если вы заключите ваши условия в операторы 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();
}

Наконец, измените свой оператор возврата, чтобы использовать только 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'));
}

NB Вам не нужно вызывать all() после pluck().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...