Условие WHERE для объединённых таблиц в Sequelize ORM
Быстрый ответ
Для фильтрации записей в присоединённой таблице при использовании Sequelize, следует задействовать опцию include
с параметром where
:
const result = await MainModel.findAll({
include: [{
model: JoinedModel,
where: { column: condition }
}]
});
В данном примере MainModel
и JoinedModel
заменяются соответствующими моделями Sequelize, column
— нужным полем, а condition
— условием фильтрации. Таким образом условие where
применяется к присоединённой таблице.
Потокобезопасная скобочная вложенность: Sequelize пребывает в непреходящей любви к вложенным скобкам, напоминающим матрёшку в JavaScript. 🇷🇺
Включение категории!
При включении моделей в запросы обратите внимание на параметры model
и required
, они играют ключевую роль для формирования корректных соединений.
{
model: JoinedModel, // Модель Sequelize для присоединённой таблицы
required: true, // Это означает использование INNER JOIN, для LEFT OUTER JOIN установите `false`
}
Динамические запросы и алиасы
При формировании динамических запросов и работы с псевдонимами полей присоединённой таблицы желательно использовать $$
:
const result = await MainModel.findAll({
include: [{
model: JoinedModel,
as: 'Alias',
where: { '$Alias.column$': condition }
}]
});
Здесь Alias
следует заменить на ваш псевдоним в ассоциации, для того, чтобы Sequelize смог корректно опознать ссылку на алиасированное поле.
Согласованное сочетание условий
Для грамотного сочетания нескольких условий в одном запросе используйте $or
:
const result = await MainModel.findAll({
include: [{
model: JoinedModel,
where: {
[Sequelize.Op.or]: [{ column1: condition1 }, { column2: condition2 }]
}
}]
});
Записи должны удовлетворять как минимум одному из условий, связанных с column1
или column2
.
Необязательные соединения
Для указания необязательных связей, в include
установите значение параметра required
как false
:
const result = await MainModel.findAll({
include: [{
model: JoinedModel,
required: false // В данном случае используем LEFT OUTER JOIN
}]
});
Такой подход позволяет Sequelize порождать строки основной таблицы, даже если в присоединённой таблице отсутствуют связанные строки.
Переход на чистый SQL
Если с задачей не справляется Sequelize, можно написать запрос на чистом SQL:
const [results, metadata] = await sequelize.query(`SELECT * FROM MainTable m JOIN JoinedTable j ON m.id = j.MainTableId WHERE j.column = :condition`, {
replacements: { condition: 'desiredCondition' }
});
Важно использовать параметризацию входных данных, чтобы избежать SQL-инъекций.
Визуализация
Представьте коробку с Lego-кубиками, где каждый цветной кубик — это отдельная таблица: Таблица A (🔵): Основная Модель
и Таблица B (🟡): Присоединённая Модель
.
Условие WHERE
для присоединённых таблиц в этой аналогии представляет собой свет поиска, выделяющий требуемые кубики:
🔵🤝🟡 с WHERE-условием для Таблицы B (🟡): Искомые Кубики
Основная идея: WHERE
-фильтр — это ваш световой маяк в навигации по поиску требуемых кубиков после объединения таблиц.
Это срочная ситуация
Если Sequelize не справляется с вашей задачей, вы всегда можете перейти к выполнению запроса на чистом SQL. Такой подход может быть уместен для сложных условий или когда важна производительность и собственный SQL-запрос окажется более эффективным.
Полезные материалы
- Основы запросов моделей | Sequelize — Официальное руководство по основам запросов Sequelize.
- Ассоциации | Sequelize — Позволит вам лучше разобраться в работе с ассоциациями.
- Проблемы · sequelize/sequelize · GitHub — Решения для частных случаев использования Sequelize.
- Ассоциации таблиц в Sequelize (Joins) — Обсуждение ассоциаций на практических примерах.
- Жадная загрузка | Sequelize — Разъяснение техники жадной загрузки для оптимизации запросов Sequelize.
- Обучающее видео по ORM Sequelize (все в одном) – YouTube — Набор ресурсов по Sequelize.
- Отношения в Sequelize — окончательное руководство | от Eth3rnit3 | Medium — Гид по отношениям в Sequelize с советами и рекомендациями.