Используя опцию include
, вы нетерпеливо загружаете указанную связанную модель.Из документов :
Когда вы извлекаете данные из базы данных, есть большая вероятность, что вы также захотите получить ассоциации с тем же запросом - это называется энергичной загрузкой.
Когда вы include
связываете модель, под капотом Sequelize присоединяет оператор соединения к запросу, который она генерирует.По умолчанию это LEFT OUTER JOIN
.Это означает, что если вы напишите:
User.findAll({ include: [{ model: Profile }] })
Результирующий запрос найдет всех пользователей.Если у пользователя есть Профиль, соответствующая строка в результате также будет содержать поля профиля.С другой стороны, мы можем заставить соединение быть INNER JOIN
, добавив параметр required
:
User.findAll({ include: [{ model: Profile, required: true }] })
Поскольку это INNER JOIN
, результирующий запрос возвращает only Пользователи, имеющие профиль.
Когда вы добавляете where
в include
, JOIN автоматически преобразуется в INNER JOIN
(если вы явно не установили required
в false
).Само условие where фактически становится частью оператора ON
INNER JOIN
.Поэтому, если мы напишем:
User.findAll({ include: [{ model: Profile, where: { id: 'someId' } }] })
, результаты будут включать всех пользователей с профилями и , где идентификатор этого профиля равен someId
.where
всегда зависит от модели, которую мы включаем, поэтому нет необходимости указывать поле id
модели, в котором мы заинтересованы.
И наконец, если использовать findOne
вместо findAll
, Sequelize просто добавляет LIMIT
из 1 к запросу, и метод разрешается к одному экземпляру модели вместо массива.
Полное обсуждение объединений выходит за рамки этого вопроса.Вы можете проверить эти другие вопросы для более подробной информации: