2017-03-22 3 views
2

私はSequelizeをORMとして使用してAPIを構築しています。私はいくつかの "リスナー"をコアロジックに組み込んで、特定の値が変更されているかどうかをチェックし、それに基づいてロジックをオフにしたいと考えました。フック(afterCreate。afterUpdate)を関連付ける(pivot、belongsToMany)が動作しない

私の主な懸念事項の1つは、顧客とユーザーの間のピボットテーブルです。 (BelongsToMany)。この関係には、 "is_admin"や "notify_user"のようなピボットの余分なフィールドがあります。これは、ユーザーが特定の顧客の管理者であること、およびシステムがこのユーザーに顧客の行動を通知する必要があることを示しています。

My 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) { /* ... */ } 
    } 
} 

は明らかにこれは、クエリのトンを生産するために起こっている、あなたはそれについて慎重に考える必要があるとそれを回避する方法。

関連する問題