Жадная загрузка и count

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

Жадная загрузка и count

Сообщение Brainfuck »

Допустим у меня есть таблицы article и comments. Соответственно к каждой статье может быть много комметариев. В модели статьи явно описано отношение comments (есть метод getComments возвращающий запрос). Я делаю выборку Article::find()->with('comments')->all() (там возможно есть еще какие-то условия, но я опущу их для примера) чтобы как-то обработать эти статьи и комментарии. Но вот что мне не нравится: мне от комментариев нужно лишь их количество для каждой статьи. Я конечно могу убрать with и сделать просто для каждой статьи подзапрос комментариев, но это сильно удлинняет все. Я бы хотел чтобы у меня именно вот так же жадно подгружалось количество комментариев. Т.е. я бы написал примерно такой селект:

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

select a.id, count(c.id) as count
from articles a
join article_comments c on c.article_id = a.id
where article_id in (1, 2, 3)
group by a.id
P.S. Уже предчувствую крики "где код" (хотя вроде и так все понятно). Упрощенно вот:

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

/**
 * @property integer $id
 * @property integer $article_id
 */
class Comment extends ActiveRecord {
}

/**
 * @property integer $id
 * @property string $name
 *
 * @property-read Comment[] $comments
 */
class Article extends ActiveRecord {
	public function getComments() {
		return $this->hasMany(Comment::class, ['article_id' => 'id']);
	}
}
Последний раз редактировалось Brainfuck 2018.07.26, 17:15, всего редактировалось 1 раз.
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Ленивая загрузка и count

Сообщение Brainfuck »

Нагуглил очень похожую тему только по Yii 1. Хмм наводит на размышления...
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Ленивая загрузка и count

Сообщение Alexum »

https://www.yiiframework.com/doc/guide/ ... -atributov . Последний пример с агрегацией.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Ленивая загрузка и count

Сообщение Dominus »

Если я правильно понял, то

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

/** @var Article $model */
$model->getComments()->count();
или

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

/** @var Article $model */
count($model->comments);
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Brainfuck
Сообщения: 313
Зарегистрирован: 2018.02.19, 14:20

Re: Ленивая загрузка и count

Сообщение Brainfuck »

Alexum писал(а): 2018.07.26, 16:53 https://www.yiiframework.com/doc/guide/ ... -atributov . Последний пример с агрегацией.
Гениально! Кажется и правда работает... :lol:
Dominus писал(а): 2018.07.26, 16:55 Если я правильно понял
Неправильно понял
Последний раз редактировалось Brainfuck 2018.07.26, 17:09, всего редактировалось 1 раз.
Ответить