javascript - 在 Sequelize.js 中自定义或覆盖连接

标签 javascript sql-server database sequelize.js

我需要使用 Sequelize.js 创建自定义连接条件使用 MSSQL。具体来说,我需要根据 TableATableB 中列的 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,我想我可以简单地使用 JOINSELECTCOALESCE 值,然后就可以开始了但在我之前的研究中读到需要重新计算该值。

我为 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/

相关文章:

sql-server - 如何在 SQL Server 中向用户定义的表类型添加索引或主键?

sql-server - 在数据库表中组织数百万个测量值

javascript - 如何在输入标签上调用验证函数

javascript - 检查数组是否有用户输入的值

javascript - 表单未获取更新的字段值

sql - 内部多次将一张表连接到另一张表

javascript - 如何在 javascript 中使用 for 循环,jquery 获取表中的行数?

java - EclipseLink 记录插入返回错误的 ID

database - yii2 使用 ActiveRecord 批量插入

android - 如何删除Android SQLite数据库?