Laravel запрос, чтобы получить все, если запрос равен 0 - PullRequest
0 голосов
/ 03 июня 2018

AT front-end У меня есть несколько кнопок выбора (выберите провайдера, выберите пользователя, период диапазона дат).

<select class="form-control" id="provider">
      <option value="0">ALL</option>
      <option value="1">First</option>
      <option value="2">Second</option>
      <option value="3">Third</option>
      <option value="4">Fourth</option>

    </select>
<select class="form-control" id="res_user">
          <option value="0">ALL</option>
          <option value="13">James</option>
          <option value="27">Perica Aleksov</option>
          <option value="30">sad</option>
          <option value="32">Test Restaurant</option>
          <option value="33">dsfdf</option>
        </select>

, поэтому теперь мне нужно построить запрос Laravel для получения данных из базы данных дляэто запрашивает, и это не проблема, когда я выбираю какую-то опцию, но у меня есть проблема, когда пользователь выбирает опцию «ВСЕ» ... как обработать это в контроллере Laravel?

Я создаю что-то вроде:

if ($request->provider == 0 AND $request->res_user== 0) {
    $vouchers = Voucher::latest()
        ->where('user_id',$request->account)
        // ->where('created_by',$request->res_user)
        // ->where('source',$request->provider)
        ->where('created_at', '>=',  Carbon::parse($request->startDate))
        ->where('created_at', '<=',  Carbon::parse($request->endDate))
        ->get();
} elseif ($request->provider == 0) {
    $vouchers = Voucher::latest()
        ->where('user_id',$request->account)
        ->where('created_by',$request->res_user)
        // ->where('source',$request->provider)
        ->where('created_at', '>=',  Carbon::parse($request->startDate))
        ->where('created_at', '<=',  Carbon::parse($request->endDate))
        ->get();
} elseif ($request->res_user== 0) {
    $vouchers = Voucher::latest()
        ->where('user_id',$request->account)
        // ->where('created_by',$request->res_user)
        ->where('source',$request->provider)
        ->where('created_at', '>=',  Carbon::parse($request->startDate))
        ->where('created_at', '<=',  Carbon::parse($request->endDate))
        ->get();
} else {
    $vouchers = Voucher::latest()
        ->where('user_id',$request->account)
        ->where('created_by',$request->res_user)
        ->where('source',$request->provider)
        ->where('created_at', '>=',  Carbon::parse($request->startDate))
        ->where('created_at', '<=',  Carbon::parse($request->endDate))
        ->get();
}

Есть ли более элегантный способ, чем этот, который я использую?

Итак, как извлечь все данные, когда request-> provider равен 0, без make if {} else {} каждый раз?

Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Используйте , когда :

$vouchers = Voucher::latest()
    ->when($request->provider != 0, function ($q) use ($request) {
        $q->where('source', $request->provider);
    })
    ->when($request->res_user != 0, function ($q) use ($request) {
        $q->where('created_by', $request->res_user);
    })
    ->where('created_at', '>=',  Carbon::parse($request->startDate))
    ->where('created_at', '<=',  Carbon::parse($request->endDate))
    ->get()

Для L5.1 я бы сделал это:

$baseQuery = Voucher::latest()
    ->where('created_at', '>=',  Carbon::parse($request->startDate))
    ->where('created_at', '<=',  Carbon::parse($request->endDate));

if ($request->provider != 0) {
    $baseQuery = $baseQuery->where('source', $request->provider);
}
if ($request->res_user != 0) {
    $baseQuery = $baseQuery->where('created_by', $request->res_user);
}

$vouchers = $baseQuery->get();
0 голосов
/ 03 июня 2018

Полагаю, вы могли бы упростить свой код как

$vouchers = Voucher::latest()
    ->where('user_id', $request->account)
    ->where('created_at', '>=', Carbon::parse($request->startDate))
    ->where('created_at', '<=', Carbon::parse($request->endDate));
/* Above don't need any if checks this criteria will always be there */
if ($request->provider == 0 && $request->res_user != 0) {
    $vouchers->where('created_by', $request->res_user);
} elseif ($request->res_user == 0 && $request->provider != 0) {
    $vouchers->where('source', $request->provider);
} else {
    $vouchers->where('created_by', $request->res_user)
             ->where('source', $request->provider);
}
$vouchers = $vouchers->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...