【问题标题】:How to set complex join conditions in sequelize?如何在 sequelize 中设置复杂的连接条件?
【发布时间】:2018-09-25 23:18:23
【问题描述】:

我正在尝试使用 sequelize 将查询编码到数据库中。这正是我要转录的句子:

SELECT matches.uid_prop, matches.uid_player, matches.porcentaje, users.uid, profile_users.name, profile_users.profile, profile_users.birthday, profile_users.location
FROM (matches JOIN users ON (((matches.uid_prop = users.uid) AND (matches.uid_player = 11)) OR ((matches.uid_player = users.uid) AND (matches.uid_prop = 11)))) JOIN profile_users USING(uid)
WHERE (matches.uid_player = 11) OR (matches.uid_prop = 11);

我不知道是否应该更改关联以便根据需要构建连接条件

Matches.belongsTo(User, {as: 'match_prop', foreignKey: 'uid_prop'});
User.hasMany(Matches, {as: 'user_prop', foreignKey: 'uid_prop'});

Matches.belongsTo(User, {as: 'match_player', foreignKey: 'uid_player'});
User.hasMany(Matches, {as: 'user_player', foreignKey: 'uid_player'});

或添加 where 并指定匹配项和用户之间的包含关系。如果是这种情况,我如何从与用户一起制作的包含中的 where 语句中引用匹配字段,以便我可以比较,例如,User.uid 和 Matches.uid_prop。 我已经尝试过这种表示法,但它不起作用:$Matches.uid_prop$

Matches.findAll({
                attributes: ['porcentaje'],
                where: {
                    $or: [
                        {uid_prop: uid},
                        {uid_player: uid}
                    ]
                },
                include: [{
                    model: User,
                    attributes: ['uid'],
                    include: [{
                        model: Profile_user,
                        attributes: ['name', 'profile', 'birthday', 'location']
                    }]
                }]
            })

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    我认为您需要的只是 required : true ( INNER JOIN ),例如:

    Matches.findAll({
                        attributes: ['porcentaje'],
                        where: {
                            $or: [
                                {uid_prop: uid},
                                {uid_player: uid}
                            ]
                        },
                        include: [{
                            model: User,
                            attributes: ['uid'],
                            required : true , //<-------- HERE -------
                            include: [{
                                model: Profile_user,
                                attributes: ['name', 'profile', 'birthday', 'location']
                            }]
                        }]
                    })
    

    您的查询正在进行 LEFT JOIN ,要使其完全强制 INNER JOIN ,您可以使用required : true

    【讨论】:

    • 它不能解决问题。这是结果连接条件:FROM "matches" AS "matches" INNER JOIN "users" AS "user" ON "matches"."uid_player" = "user"."uid" LEFT OUTER JOIN "profile_users" AS "user.profile_user" ON "user"."uid" = "user.profile_user"."uid" 不是:FROM (matches JOIN users ON (((matches.uid_prop = users.uid) AND (matches.uid_player = 11)) OR ((matches.uid_player = users.uid) AND (matches.uid_prop = 11)))) JOIN profile_users USING(uid) 它只是使用 1 个关联,有办法让 sequelize 使用两者来构造查询?
    猜你喜欢
    • 2014-06-22
    • 2021-03-08
    • 2022-09-23
    • 2014-08-25
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多