Задать вопрос

Как на Sequelize составить нужный запрос?

Подскажите, как на Sequelize составить такой запрос:

(в скобках названия моделей)
Есть модель Пользователи (Users)
Есть модель Цвета (Colors)
Есть модель Статусы (Statuses)
Есть модель Отзывы (Reviews).
Каждый отзыв может иметь несколько статусов, связь - models.Reviews.belongsToMany(models.Statuses, {through: 'reviews_statuses'});

Есть модель ColorsUserReviews, которая хранит в себе данные когда один пользователь помечает какой-то отзыв любым из цветов
models[ColorsUserReviews].belongsTo(models.Users, {onDelete: 'cascade'});
models[ColorsUserReviews].belongsTo(models.Reviews, {onDelete: 'cascade'});
models[ColorsUserReviews].belongsTo(models.Colors, {onDelete: 'cascade'});

Нужно получить список отзывов по фильтру.
Есть данные для фильтра:
Statuses: [1,3,5] - статусы с идентификатором 1, 3 и 5
Description: "text" - текст, которые содержится в Reviews.description
Colors: [2,4] - цвета с идентификаторами 2 и 4,
User: 1 - идентификатор пользователя

Результат выборки все отзывы которые имеют хотя бы один из перечисленных статусов
затем найденные отзывы фильтруются по содержанию Reviews.description (должны содержать переданный текст)
затем эти отзывы должны быть отфильтрованы по перечисленным цветам. Берется пользователь и список цветов, на основе данных в ColorsUserReviews фильтруем полученные отзывы

Нужна еще одна выбрка. Данные теже самые, поиск отзывов по перечисленным статусам ПЛЮС все отзывы которые вообще не имеют статусов

БД - mysql
размер строки mysql запроса не должен зависеть от количества записей в БД
  • Вопрос задан
  • 753 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
yarkov
@yarkov
Помог ответ? Отметь решением.
Если я правильно понял, то примерно так:
/*
Есть модель Пользователи (Users)
Есть модель Цвета (Colors)
Есть модель Статусы (Statuses)
Есть модель Отзывы (Reviews).
Каждый отзыв может иметь несколько статусов, связь - models.Reviews.belongsToMany(models.Statuses, {through: 'reviews_statuses'});
*/

var statuses = [1,3,5];     //  - статусы с идентификатором 1, 3 и 5
var description = "text";   //  - текст, которые содержится в Reviews.description
var colors = [2,4];         //  - цвета с идентификаторами 2 и 4,
var user = 1;               //  - идентификатор пользователя

Reviews.findAll({
        where: {
            description: {
                $like: description
            }
        },
        include: [{
            model: Statuses,
            attributes: ['id'],
            where: {
                reviews_statuses: {
                    $in: statuses
                }
            }
        },
        {
            model: Colors,
            attributes: ['id'],
            where: {
                color_id: {
                    $in: colors
                }
            }
        },
        {
            model: Users,
            attributes: ['id'],
            where: {
                id: user
            }
        }]
    });
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы