Получить модели не пустых категорий

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
xulu
Сообщения: 7
Зарегистрирован: 2016.07.21, 00:02

Получить модели не пустых категорий

Сообщение xulu »

Есть посты и есть категории этих постов. У поста есть category_id.
Мне нужно в ActiveQuery получить все категории у которых есть хотябы один пост. Т.е. чтобы я смог просто получать модели категорий одной строчкой вот так:

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

$categories = Category::find()->giveMeNotEmpty()->all();

На чистом SQL я решил эту задачу так:

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

SELECT * from category WHERE EXISTS (SELECT * FROM post WHERE post.category_id = category.id)
Не получается найти решение для ActiveQuery.
Пробовал что-то типа такого, но это не работает потому что внутри where так писать нельзя.

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

class CategoryQuery extends ActiveQuery
{
	public function giveMeNotEmpty()
	{
		$subQuery = Post::find()->where(['post.category_id' => 'category.id']);
	        return $this->where(['exists', $subQuery]);
	}
}
Подскажите пожалуйста правильное решение.
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Получить модели не пустых категорий

Сообщение rak »

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

SELECT category.* 
FROM category 
JOIN post ON post.category_id = category.id
GROUP BY category.id
xulu
Сообщения: 7
Зарегистрирован: 2016.07.21, 00:02

Re: Получить модели не пустых категорий

Сообщение xulu »

rak
Спасибо. В ActiveQuery сделал так:

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

class CategoryQuery extends ActiveQuery
{
	public function giveMeNotEmpty()
	{
		return $this->innerJoinWith('posts')->groupBy('category.id');
	}
}
А это правда что если есть возможность не использовать вложенный подзапрос (например с exists) то его лучше не использовать а использовать join?
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Получить модели не пустых категорий

Сообщение rak »

xulu писал(а): 2017.03.30, 22:31 А это правда что если есть возможность не использовать вложенный подзапрос (например с exists) то его лучше не использовать а использовать join?
можно посмотреть explain и узнать ;)
Ответить