2017-01-04 14 views
2

MSSQLでSequelize.jsを使用してカスタム結合条件を作成する必要があります。Sequelize.jsのカスタムまたはオーバーライド

:私は私の参加で OR句のために解決したい

LEFT OUTER JOIN [TableB] 
    ON [TableB].[ColumnB] = COALESCE (
     [TableC].[ColumnC], 
     [TableA].[ColumnA] 
    ) 

:具体的には、私はTableATableBの列からCOALESCE値に基づいてTableBに参加し、このような結合条件で終わる必要があります

LEFT OUTER JOIN [TableB] 
    ON [TableB].[ColumnB] = [TableA].[ColumnA] 
    OR [TableB].[ColumnB] = [TableC].[ColumnC] 

I readrequired: falseをスコープ定義に含めることで、このような動作を実現できます。ご覧のとおり、私はこれを有効にしようとしている私の範囲を取り払ってきました。私はMySQLを使用していた場合

LEFT OUTER JOIN [TableB] 
    ON [TableB].[ColumnB] = [TableA].[ColumnA] 
    AND [TableB].[ColumnB] = COALESCE (
     [TableC].[ColumnC], 
     [TableA].[ColumnA] 
    ) 

、私は単にJOINSELECTからCOALESCE値を使用することができると思うとに良いこと:

私が得ることができる最高のは、これが(AND句に注意してください)です私の以前の研究では、値を再計算する必要があることを読みました。

私はTableAのためのダウン剥奪モデル定義用意しました:

export default (sequelize, DataTypes) => sequelize.define('TableA', 
    { 
     // Attributes omitted.. 
    }, 
    { 
     classMethods: { 
      associate ({ 
       TableB, 
       TableC 
      }) { 
       this.belongsTo(TableB, { 
        foreignKey: 'ColumnA', 
        targetKey: 'ColumnB' 
       }); 

       this.belongsTo(TableC, { 
        foreignKey: 'ColumnA', 
        targetKey: 'ColumnC' 
       }); 
      }, 
      attachScope ({ 
       TableB, 
       TableC 
      }) { 
       this.addScope('defaultScope', { 
        attributes: [ 
         ...Object.keys(this.attributes), 
         [ 
          sequelize.fn(
           'COALESCE', 
           sequelize.col('[TableC].[ColumnC]'), 
           sequelize.col('[TableA].[ColumnA]') 
          ), 
          'ColumnA' 
         ] 
        ], 
        include: [ 
         { 
          model: TableB, 
          where: { 
           ColumnB: sequelize.fn(
            'COALESCE', 
            sequelize.col('[TableC].[ColumnC]'), 
            sequelize.col('[TableA].[ColumnA]') 
           ) 
          }, 
          required: false 
         }, 
         { 
          model: TableC, 
          required: false 
         } 
        ], 
        required: false 
       }, { override: true }); 
      } 
     } 
    } 
); 

をどのような援助をいただければ幸いです、そして任意の追加情報が必要な場合は私に知らせてください。

注:私は従来のデータベースを使用していますが、残念ながらデータ構造を変更することはできません。

答えて

0

こんにちは私は同じ問題があり、私はSQLの純粋なクエリを使用して解決しました。

例:問題は、この機能ではなくIMyTypeInstance

のIMyTypeを返すことである

const query = `SELECT s.*, us.UserId \ 
       FROM UserSections AS us \ 
       RIGHT JOIN Sections AS s ON (s.id = us.SectionId) \ 
       WHERE s.parentId = ${sectionId}`; 

return db.query(query, { type: db.QueryTypes.SELECT }); 

それはあなたのために働くことはできますか?

+0

提案していただきありがとうございますが、単純に生のクエリを使用しないようにする関連付けのレイヤーがいくつかあります。私はできることを望む! –

関連する問題