Sequelize.js 中的自定义或覆盖连接

2024-06-19

我需要使用创建自定义连接条件Sequelize.js http://sequelizejs.com使用 MSSQL。具体来说,我需要加入TableB基于一个COALESCE中的列的值TableA and 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]

I read https://stackoverflow.com/a/39774664/2345211你可以通过包括来实现这样的行为required: false在你的范围定义中。正如你所看到的,我已经在我的瞄准镜上贴满了它,试图让它发挥作用。

我能得到的最好的就是这个(注意AND条款):

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

如果我使用 MySQL,我想我可以简单地使用COALESCE值来自SELECT in the JOIN很高兴去,但在我之前的研究中读到需要重新计算价值。

我已经包含了一个精简的模型定义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 纯查询解决了。

Example:

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

它可以为你工作吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sequelize.js 中的自定义或覆盖连接 的相关文章

随机推荐