Как получить резервную строку в построителе запросов laravel? - PullRequest
0 голосов
/ 13 июля 2020

У меня есть таблица базы данных в следующем формате.

| from_zone | from_type | to_zone | to_type  | client_id | rate |
|-----------|-----------|---------|----------|-----------|------|
| north     | national  | north   | national | 1         | 12   |
| north     | national  | north   | metro    | 1         | 15   |
| north     | national  | north   | metro    | null      | 21   |

Модель - Drate, table - drates

чтобы получить скорость для идентификатора клиента 1, у нас есть следующий запрос

$drate=Drate::where('from_zone','north')->where('from_type','national')
->where('to_zone','north')->where('to_type','metro')
->where('client_id',1)->get();
dd($drate->rate);
// output is 15

как получить частоту отката, если не указан идентификатор клиента (например, 21)? если идентификатор клиента предоставлен, ставка 15.

1 Ответ

0 голосов
/ 14 июля 2020

Добро пожаловать в SO.

Одним из возможных решений было бы условное добавление предложения where ('client_id', 1).

$drate = Drate::where('from_zone','north')
    ->where('from_type','national')
    ->where('to_zone','north')
    ->where('to_type','metro');

if( client id provided condition is true ) // pseudo-code
    $drate->where('client_id',1);

$drate = $drate->get();

Изменить: имейте в виду, что это приведет к в нескольких матчах. Обе строки в вашем примере будут сопоставлены.

Вы могли бы if / else запрос возвращать только тогда, когда client_id = null, когда он не указан whereNull ('client_id') .

if( client id provided condition is true ) // pseudo-code
    $drate->where('client_id',1);
else
    $drate->whereNull('client_id');

с другой стороны, он также может соответствовать другим записям с тем же условием (например, несколько строк с нулевым клиентом).

Решите, каким должен быть результат, когда client_id = null, и какая сортировка если вам требуется несколько результатов.

Например, если вам требуется, чтобы client_id = null возвращал только 1 результат, и этот результат должен быть наивысшим результатом, вы можете объединить orderBy ('rate', 'des c ') с first () вместо get ();

...