2017-03-22 7 views
2

ORM으로 Sequelize를 사용하여 API를 빌드하고 있습니다. 핵심 논리에 일부 "청취자"를 통합하여 특정 값이 변경되었는지 확인하고이를 기반으로 일부 논리를 해제하고자했습니다.후크 (afterCreate. afterUpdate)를 연관 (pivot, belongsToMany)에서 작동하지 않음

내 주요 관심사 중 하나는 고객과 사용자 간의 피벗 테이블입니다. (BelongsToMany). 관계에는 "is_admin"또는 "notify_user"와 같은 피벗에 몇 가지 추가 필드가 있습니다. 이것은 사용자가 특정 고객에 대한 관리자이고 시스템이이 사용자에게 고객 조치에 대해 통지해야 하는지를 설명합니다.

내 API는 피벗 테이블 데이터의 PATCHING을 지원합니다. 이제 내가하고 싶은 일은 is_admin 값이 변경되면 foo를 다른 곳에서 업데이트하기 위해 다른 로직을 해제하는 것입니다.

모든 후크는 기본 개체 모델 (사용자 및 고객)에서 작동합니다. 그러나 피벗 개체 모델에서 내 후크 중 하나도 해고되지 않습니다.

Sequelize에서 지원되는지 확실하지 않습니다. 사전에

덕분에

나의 관계는 다음과 같이 설정은 다음과 같습니다

private static setupCustomerRelations(sq: Sequelize.Sequelize) { 

    const user = sq.models['User'] || new UserRepo().getNewInstance().getModel(); 
    const customer = sq.models['Customer'] || new CustomerRepo().getNewInstance().getModel(); 
    const customerUsers = sq.models['customer_users'] || new CustomerUsersRepo().getNewInstance().getModel() 
    const machine = sq.models['Machine'] || new MachineRepo().getNewInstance().getModel() 

    customer.belongsToMany(user, {'through': customerUsers}); 
    user.belongsToMany(customer, {'through': customerUsers}); 

    // Machines 
    machine.belongsTo(customer, {'foreignKey':'customer_id'}); 
    customer.hasMany(machine, {'foreignKey':'customer_id'}); 
} 

그리고이 customerUsers 내가 테이블을 조인에 Bulk hooks과 행운 했어 적절한 모델

+0

'belongsToMany' 연관은 어떻게 정의되어 있습니까? 피벗 테이블이 적절한 모델입니까, 아니면 연결 구성에 문자열로 정의되어 있습니까? –

+0

위의 질문을 편집합니다 – pythic

+0

작동하지 않는 고리를 보여줄 수 있습니까? –

답변

1

입니다. 조인 테이블 모델에서 beforeBulkCreatebeforeBulkUpdate을 사용해보십시오.

CustomerUser.addHook('beforeBulkCreate', 'admin-only', async function(customerUsers) { 
    for (const customerUser of customerUsers) { 
    const user = await User.findById(customer); 
    if (user.isAdmin) { /* ... */ } 
    } 
} 

분명히 이것은 많은 수의 검색어를 생성 할 것이며 분명히 그것에 대해 생각하고이를 방지하는 방법을 고려해야합니다.