Spec-Zone.ru › Sequelize 5

Ассоциация

Прямой подкласс:

BelongsTo, BelongsToMany, HasMany, HasOne

Создание ассоциаций в sequelize выполняется вызовом одной из функций belongsTo / hasOne / hasMany / belongsToMany на модели (источник) и указанием другой модели в качестве первого аргумента функции (цель).

  • hasOne - добавляет внешний ключ к цели и единственные ассоциативные миксины к источнику.
  • belongsTo - добавляет внешний ключ и единственные ассоциативные миксины к источнику.
  • hasMany - добавляет внешний ключ к цели и множественные ассоциативные миксины к источнику.
  • belongsToMany - создаёт ассоциацию N:M с таблицей соединения и добавляет множественные ассоциативные миксины к источнику. Таблица соединения создаётся с полями sourceId и targetId.

Создание ассоциации добавит ограничение внешнего ключа к атрибутам. Все ассоциации используют CASCADE при обновлении и SET NULL при удалении, за исключением n:m, которая также использует CASCADE при удалении.

При создании ассоциации можно указать псевдоним с помощью опции as. Это полезно, если одна и та же модель ассоциирована дважды или вы хотите, чтобы ваша ассоциация называлась иначе, чем имя целевой модели.

В качестве примера рассмотрим случай, когда пользователи имеют много фотографий, одна из которых является их профильной фотографией. Все фотографии имеют userId, но кроме того, модель пользователя также имеет profilePictureId, чтобы легко загрузить профильную фотографию пользователя.

User.hasMany(Picture)
User.belongsTo(Picture, { as: 'ProfilePicture', constraints: false })

user.getPictures() // gets you all pictures
user.getProfilePicture() // gets you only the profile picture

User.findAll({
  where: ...,
  include: [
    { model: Picture }, // load all pictures
    { model: Picture, as: 'ProfilePicture' }, // load the profile picture.
    // Notice that the spelling must be the exact same as the one in the association
  ]
})

Для полного контроля над столбцом внешнего ключа, добавленным sequelize, можно использовать опцию foreignKey. Она может быть строкой, которая определяет имя, или объектом типа определения, эквивалентным тем, что передаются в sequelize.define.

User.hasMany(Picture, { foreignKey: 'uid' })

Столбец внешнего ключа в Picture теперь будет называться uid вместо стандартного userId.

User.hasMany(Picture, {
  foreignKey: {
    name: 'uid',
    allowNull: false
  }
})

Это указывает, что столбец uid не может быть null. В большинстве случаев это уже будет учтено ограничениями внешних ключей, которые sequelize создаёт автоматически, но может быть полезно в случае, когда внешние ключи отключены, например, из-за циклических ссылок (см. constraints: false ниже).

При извлечении связанных моделей можно ограничить запрос только некоторыми моделями. Эти запросы пишутся так же, как запросы к find/findAll. Чтобы получить только фотографии в формате JPG, можно сделать:

user.getPictures({
  where: {
    format: 'jpg'
  }
})

Существует несколько способов обновления и добавления новых ассоциаций. Продолжим с нашим примером пользователей и фотографий:

user.addPicture(p) // Add a single picture
user.setPictures([p1, p2]) // Associate user with ONLY these two picture, all other associations will be deleted
user.addPictures([p1, p2]) // Associate user with these two pictures, but don't touch any current associations

Вам не нужно передавать весь объект в функции ассоциаций, если ваша связанная модель имеет единственный первичный ключ:

user.addPicture(req.query.pid) // Here pid is just an integer, representing the primary key of the picture

В примере выше мы указали, что пользователь принадлежит к его профильной фотографии. Понятие, возможно, не имеет смысла, но поскольку мы хотим добавить внешний ключ к модели пользователя, это способ сделать это.

Обратите внимание, что мы также указали constraints: false для профильной фотографии. Это связано с тем, что мы добавляем внешний ключ от пользователя к фотографии (profilePictureId) и от фотографии к пользователю (userId). Если бы мы добавили внешние ключи к обоим, это создало бы циклическую зависимость, и sequelize не знал бы, какую таблицу создавать первой, так как пользователь зависит от фотографии, а фотография зависит от пользователя. Такие проблемы обнаруживаются sequelize до синхронизации моделей с базой данных, и вы получите ошибку примерно такого вида: Error: Cyclic dependency found. 'users' is dependent of itself. В этом случае вы должны либо отключить некоторые ограничения, либо полностью пересмотреть свои ассоциации.

Краткое описание членов

Общедоступные члены
public

associationType: string

Тип ассоциации.

public

source: Model

public

target: Model

Общедоступные члены

public associationType: string source

Тип ассоциации. Один из HasMany, BelongsTo, HasOne, BelongsToMany

public source: Model source

public target: Model source

Copyright © 2014–present Sequelize contributors
Licensed under the MIT License.
https://sequelize.org/v5/class/lib/associations/base.js~Association.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API