Laravel: ошибка при использовании first () вплотную в построителе запросов - PullRequest
0 голосов
/ 04 октября 2018

У меня есть следующий код в моем проекте laravel

$config = DB::table('custom_config')->where('item_id', 5);
$cost = [
    'car_service_fee' => $config->where('managed_by', 1)->first()->service_fee,
    'bike_service_fee' => $config->where('managed_by', 2)->first()->service_fee
];

Моя таблица custom_config соответствует приведенной ниже.

+---------+------------+-------------+
| item_id | managed_by | service_fee |
|---------+------------+-------------|
|    5    |       1    |    8.5      |
|---------+------------+-------------|
|    5    |       2    |    2.0      |
+---------+------------+-------------+

my car_service_fee извлекает результат 8.5

но мой bike_service_fee возвращает null на first()

Тот же код работает, если он похож на приведенный ниже,

$cost = [
    'car_service_fee' => DB::table('custom_config')->where('item_id', 5)->where('managed_by', 1)->first()->service_fee,
    'bike_service_fee' => DB::table('custom_config')->where('item_id', 5)->where('managed_by', 2)->first()->service_fee
];

IsЕсть ли проблема в методе «спина к спине» first(), используемом в построителе запросов, который хранится в переменной или что-то в laravel?

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

каждый раз, когда вы вызываете функцию where() для объекта $config, создайте для него новую копию и затем вызовите функцию

$cost = [
     'car_service_fee' => (clone $config)->where('managed_by', 1)->first()->service_fee,
     'bike_service_fee' => (clone $config)->where('managed_by', 2)->first()->service_fee
];
0 голосов
/ 04 октября 2018

$config - это объект Query Builder.Большинство вызовов, которые вы делаете по этому объекту, являются «построением» запроса.Объект сохраняет все эти where условия внутри.Когда вызывается метод для выполнения запроса, он компилирует запрос, выполняет его и возвращает результат [вызов first или get или ...].Сам конструктор все еще существует как конструктор и может продолжать построение, или запрос может быть выполнен снова и т. Д.

В вашем случае вы добавляете больше условий where к этому единственному объекту запроса, $config, каждый раз, когда вы вызываете where для него.

Вы можете увидеть это поведение в любое время, вызвав toSql в конструкторе, чтобы увидеть, как будет выглядеть сгенерированный запрос.

Этого можно избежать, создав новый объект-конструктор или клонировав $config, чтобы можно было создать два отдельных запроса.

Пример:

$config = DB::table('custom_config')->where('item_id', 5);
$config2 = clone $config;

$cost = [
     'car_service_fee' => $config->where('managed_by', 1)->first()->service_fee,
     'bike_service_fee' => $config2->where('managed_by', 2)->first()->service_fee
];

$config и $config2 обаиметь первое where условие.

Вы также можете просто клонировать их встроенными, если вам не нужны эти строители после факта:

'car_service_fee' => (clone $config)->where(...)->first()->...,
'bike_service_fee' => (clone $config)->where(...)->first()->...,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...