我需要使用 Sequelize.js 创建自定义连接条件使用 MSSQL。具体来说,我需要根据 TableA
和 TableB
中列的 COALESCE
值加入 TableB
并结束像这样的连接条件:
LEFT OUTER JOIN [TableB]
ON [TableB].[ColumnB] = COALESCE (
[TableC].[ColumnC],
[TableA].[ColumnA]
)
我会在连接中使用 OR
子句:
LEFT OUTER JOIN [TableB]
ON [TableB].[ColumnB] = [TableA].[ColumnA]
OR [TableB].[ColumnB] = [TableC].[ColumnC]
我read您可以通过在范围定义中包含 required: false
来实现这样的行为。如您所见,我已经在我的示波器上贴满了它,试图让它发挥作用。
我能得到的最好的是这个(注意 AND
子句):
LEFT OUTER JOIN [TableB]
ON [TableB].[ColumnB] = [TableA].[ColumnA]
AND [TableB].[ColumnB] = COALESCE (
[TableC].[ColumnC],
[TableA].[ColumnA]
)
如果我使用的是 MySQL,我想我可以简单地使用 JOIN
中 SELECT
的 COALESCE
值,然后就可以开始了但在我之前的研究中读到需要重新计算该值。
我为 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 });
}
}
}
);
如有任何帮助,我们将不胜感激,如果需要任何其他信息,请告诉我。
注意:我正在使用遗留数据库,遗憾的是无法更改数据结构。
最佳答案
您好,我遇到了同样的问题,最后我使用 SQL 纯查询解决了问题。
例子:
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 });
问题是这个函数将返回一个 IMyType 而不是 IMyTypeInstance
它对你有用吗??
关于javascript - 在 Sequelize.js 中自定义或覆盖连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41467135/