Yii2 выборка при жадной загрузке

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Vadim7423
Сообщения: 59
Зарегистрирован: 2016.07.07, 20:21

Yii2 выборка при жадной загрузке

Сообщение Vadim7423 »

Здравствуйте. Есть такой вот запрос:

Код: Выделить всё

$last_news_sitebar = Articles::find()->with('themes', 'categories', 'imageRico')->select(['articles.id', 'articles.title', 'articles.created'])->where(['visible' => '1', 'articles.category_id' => '1'])->orderBy(['articles.created' => SORT_DESC])->limit(40)->all();
 
вопрос - можно как то в метод select() передать поля из таблиц themes и categories ? Если не использовать select() то подгружается очень много ненужных данных, если использовать его в том виде как сейчас, то судя по распечатке данные из таблиц themes и categories не подгружаются, если использовать отложенную загрузку, то осуществляется множество запросов к базе данных. В общем помогите разобраться новичку
Аватара пользователя
mat.twg
Сообщения: 222
Зарегистрирован: 2012.02.22, 20:44
Откуда: Санкт-Петербург

Re: Yii2 выборка при жадной загрузке

Сообщение mat.twg »

\yii\db\Query()

а так на вскидку...

->select(['articles.id', 'articles.title', 'articles.created' , 'themes.id', 'categories.id'...]) только вместо реляций надо имена таблиц писать

пс: так и не увидел запроса....
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Yii2 выборка при жадной загрузке

Сообщение Nerf »

Нет, используя with(), нельзя. Посмотрите ~joinWith(). Несколько запросов не всегда хуже чем 1 с джоинами. И много = 3+(не считая схем)?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Yii2 выборка при жадной загрузке

Сообщение zelenin »

Vadim7423 писал(а):Здравствуйте. Есть такой вот запрос:

Код: Выделить всё

$last_news_sitebar = Articles::find()->with('themes', 'categories', 'imageRico')->select(['articles.id', 'articles.title', 'articles.created'])->where(['visible' => '1', 'articles.category_id' => '1'])->orderBy(['articles.created' => SORT_DESC])->limit(40)->all();
вопрос - можно как то в метод select() передать поля из таблиц themes и categories ? Если не использовать select() то подгружается очень много ненужных данных, если использовать его в том виде как сейчас, то судя по распечатке данные из таблиц themes и categories не подгружаются, если использовать отложенную загрузку, то осуществляется множество запросов к базе данных. В общем помогите разобраться новичку
а зачем вы используете AR, если ва мне нужна в данном случае AR-модель? используйте обычный запрос.
Vadim7423
Сообщения: 59
Зарегистрирован: 2016.07.07, 20:21

Re: Yii2 выборка при жадной загрузке

Сообщение Vadim7423 »

Да я уж несколько способов перепробовал... не могу получить то что нужно.
Пытаюсь вот таким способом получить данные:

Код: Выделить всё

$last_news_sitebar = (new \yii\db\Query())
               ->select(['a.id', 'a.title', 'a.created', 't.theme_alias', 'c.alias', 'i.id', 'i.filePath', 'i.itemId', 'i.isMain', 'i.modelName', 'i.urlAlias', 'i.name'])
                ->from(['a' => 'articles'])
                ->join('LEFT JOIN', ['t' => 'themes'], 't.id = a.theme_id')
                ->join('LEFT JOIN', ['c' => 'categories'], 'c.id = a.category_id')
                ->join('LEFT JOIN', ['i' => 'image'], 'i.itemId = a.id')
                ->where(['visible' => '1', 'a.category_id' => '1'])
                ->orderBy(['a.created' => SORT_DESC])
                ->limit(40)
               ->all();
 
В итоге потом данные в цикле доступны примерно вот так $value['title'], $value[id], а мне надо чтобы были объекты, так как установил расширение yii2-images и оно не работает с массивами.
Вот так пробовал:

Код: Выделить всё

 $last_news_sitebar2 = Articles::find()
               ->select(['articles.id', 'articles.title', 'articles.created'])
               ->with(['categories' => function(\yii\db\ActiveQuery $query){
                   $query->select('alias');
               },
                'themes' => function(\yii\db\ActiveQuery $query){
                   $query->select('theme_alias');
               },
                 'imageRico'])
                ->where(['visible' => '1', 'articles.category_id' => '1'])
                ->orderBy(['articles.created' => SORT_DESC])
                ->limit(40)
               ->all();
 
Тоже не могу получить данные из themes и categories.
Если вот так написать:

Код: Выделить всё

$last_news_sitebar3 = Articles::find()->with(['themes', 'categories', 'imageRico'])->limit(40)->all();
 
Все данные подгружаются из всех таблиц, 6о вместе с ними и много лишнего.
Ответить