sequlize에서 include를 사용하면 나의 생각으로 범위 확장? 처럼 이해를 하였다. 또는 테이블 간의 조인으로 생각 하였다.
실제 업무에서 include를 사용한것을 정리해 보겠습니다.
const artist = await models.Artist.findAll({
where: { releasedAt: date }})
const user = await models.Subscribe.findAll({
where: { artistId: artist.id, subscription: 'subscribed' },})
const coupon = await models.Coupon.findAll({
where: { artistId: artist.id }})
const classes = await models.Class.findAll({
where: { artistId: artist.id }, })
위의 코드를 include를 이용하면 줄일 수 있습니다.
const artists = await models.Artist.findAll({
where: { releasedAt: date },
include: [
'classes',
'coupons',
{
association: 'subscribes',
where: { subscription: 'subscribed' },
required: true,
},
],
transaction,
})
공통의 조건을 where: { releasedAt: date }로 묶고
include안에 추가 하고자 하는 모델의 명을 적어 줍니다. classes,coupons
subscribes는 검색의 조건이 한가지 더 추가 되므로 association : 'subscribes'을 적어주고 추가 되는 조건 where: { subscription: 'subscribed' },을 적어줍니다.
required: true는 INNER JOIN을 수행하게 되고, 조건에 부합하는 서브 모델의 항목만을 반환할 것입니다. 행당 항목만 반환 하고 싶으면 ture 모두 반환 할려면 false를 추가 합니다.
위에 구조로는 artist안에 classes, coupons,subscribes가 추가 된것입니다.
그래서 모델에서 넣어 주겠습니다.
declare module '../entities/Artist' {
interface Artist {
classes: Class[]
}
}
한개의 아티스트에 클래스는 여러개 이므로 1:N 구조로 넣어 줍니다.
declare module '../entities/Artist' {
interface Artist {
coupons: Coupon[]
}
}
한개의 아티스트에 여러개의 쿠폰발급 가능 1:N구조로 넣어 줍니다.
declare module '../entities/Subscribe' {
interface Subscribe {
artist: Artist
}
}
declare module '../entities/Artist' {
interface Artist {
subscribes: Subscribe[]
}
}
N:M의 관계 입니다.