Страница 1 из 1

Запрос для поиска релевантных статей

Добавлено: 2017.03.29, 20:06
satoved
Есть модель Article и некий набор разных категорий, куда может цепляться этот Article, например Category и List, и связи many-to-many в таблицах "article_list" и "article_category".

Задача: найти релевантные Article для заданной модели статьи, в которых совпадает хотя бы одна Category или List.

Получилось решить только через кучу запросов.

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

$categoryIds = new \yii\db\Query())
                ->select('category_id')
                ->from("article_category")
                ->where(['article_id' => $article->primaryKey])
                ->column();
                
$relevantByCategory = new \yii\db\Query())
                ->select('article_id')
                ->from("article_category")
                ->where(['category_id' => $categoryIds])
                ->all();
                
$listIds = new \yii\db\Query())
                ->select('list_id')
                ->from("article_list")
                ->where(['article_id' => $article->primaryKey])
                ->column();
                
$relevantByList = new \yii\db\Query())
                ->select('article_id')
                ->from("article_list")
                ->where(['list_id' => $listIds])
                ->all();
                
return Article::find()->where(['id' => ArrayHelper::merge($relevantByCategory, $relevantByList)])->all();               
А у меня 6 таких родительских моделей, получается 13 запросов на такую плевую задачу.

Подскажите красивое решение.

Re: Запрос для поиска релевантных статей

Добавлено: 2017.03.30, 04:53
ElisDN
13 запросов по индексам - это быстро. Удобнее через ElasticSearch, но для простого сайта это не всегда рентабельно.

Re: Запрос для поиска релевантных статей

Добавлено: 2017.03.30, 07:06
rodion_zlobin
Можно сократить, добавив or в where выражение

Re: Запрос для поиска релевантных статей

Добавлено: 2017.03.30, 07:33
ElisDN
rodion_zlobin писал(а):
2017.03.30, 07:06
Можно сократить, добавив or в where выражение
Тогда будет пять IN SELECT подзапросов.