lexbond писал(а): ↑2021.04.09, 17:26
Привет, коллеги! Возник такой вопрос:
Допустим выбираем данные из таблички, в методе with добавляем выборку связанных данных. Это 2 связи из возможных 4х.
Код: Выделить всё
$model = RetailerDB::find()
->with('priceLevels', 'cities')
->where('url=:url', [':url'=>$url])
->one();
Потом модели перебрасываем в обычные объекты допустим через метод fill($model): DTO.
В этом методе проверяем, если есть данные в связанных таблицах, то заполняем их, если нет, то оставляем null.
Так вот если использовать метод fill для разных выборок, то при проверке существования данных по связям если они есть, то всё гуд, перебрасываем.
А если в выборке данных нет, а проверяем мы это допустим так if(isset($model->categories)), то вместо возврата нам пустоты срабатывает ленивая загрузка и подгружает нам данные, не нужные в этом случае.
Может как то можно отключить ленивую подгрузку или я что то не так делаю?
Во-1 есть два варианта использования связанных данных.
Первый вариант как у вас, используя with.
Тогда обращаясь к модели можно взять наименование по связанным данным
Код: Выделить всё
$model->priceLevels->level_name;
$model->cities->city_name;
Второй вариант подходит, если данные выводятся в табличном виде и идёт поиск по связанным данным.
Код: Выделить всё
$model = RetailerDB::find()
->joinWith('priceLevels', false, 'LEFT JOIN')
->joinWith('cities', true, 'LEFT JOIN')
->where('url=:url', [':url'=>$url])
->one();
В первом случае он не будет прописывать запросы, если нет обращения к данным из связанной таблицы
Однако, если строк в таблице будет 100, то при таком выводе будет 100 дополнительных запросов в БД.
Чтобы избежать дополнительных запросов используется жадная загрузка и вторым параметром передаётся
TRUE
Для городов уже будут загружены все данные, которые выведены в таблице и будет сделан один запрос в БД.
Такого плана будет запрос:
SELECT * FROM cities WHERE city_id IN (тут 100 идентификаторов)
В своем ответе я объяснил как можно использовать данные, если что-то не то, то опишите проблему чуть более яснее.