如何在 Sequelize 中使用 LEFT JOIN?

Posted

技术标签:

【中文标题】如何在 Sequelize 中使用 LEFT JOIN?【英文标题】:How can I use LEFT JOIN with Sequelize? 【发布时间】:2015-02-18 03:29:34 【问题描述】:

我有以下 Sequelize 关系:

Shop.hasMany(ShopAd, foreignKey : 'shop_id', as : 'ads');
ShopAd.belongsTo(Shop, foreignKey : 'id')

对于以下 Sequelize 查询:

Shop.findAll(
    where: id:shopId,
    include: [model:ShopAd, as:'ads', where:is_valid:1, is_vertify:1]
).success(function(result) 
    callback(result);
);

Sequelize 为此查询运行的 SQL 是:

SELECT `Shop`.`id`, `Shop`.`user_id`, `Shop`.`short_name`, `Shop`.`description`, `Shop`.`tips`, `Shop`.`city`, `Shop`.`province`, `Shop`.`address`, `Shop`.`logo`, `Shop`.`publicity_photo`, `Shop`.`taobao_link`, `Shop`.`is_vertify`, `Shop`.`create_time`, `Shop`.`update_time`, `ads`.`id` AS `ads.id`, `ads`.`shop_id` AS `ads.shop_id`, `ads`.`pic_url` AS `ads.pic_url`, `ads`.`description` AS `ads.description`, `ads`.`link` AS `ads.link`, `ads`.`is_valid` AS `ads.is_valid`, `ads`.`is_vertify` AS `ads.is_vertify`, `ads`.`create_time` AS `ads.create_time`, `ads`.`update_time` AS `ads.update_time` FROM `weshop_shop` AS `Shop`
INNER JOIN `weshop_shop_advertsing` AS `ads` ON `Shop`.`id` = `ads`.`shop_id` AND `ads`.`is_valid`=1 AND `ads`.`is_vertify`=1 WHERE `Shop`.`id`='1';

执行INNER JOIN

我想改用LEFT JOIN。如何使用 Sequelize 做到这一点?

【问题讨论】:

【参考方案1】:

使用: required:false

句子

Shop.findAll(
     where:id:shopId, 
     include:[
          model:ShopAd, as:'ads', 
           where: 
                 is_valid:1, 
                 is_vertify:1,   
           required:false
           
         ]
      )
      .success(function(result) 
        callback(result);
    );

【讨论】:

但是如何在关系的声明中强制使用 LEFT JOIN?【参考方案2】:

required: true 强制INNER JOIN,使用required: false 强制LEFT JOIN

取自here。

【讨论】:

以上是关于如何在 Sequelize 中使用 LEFT JOIN?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Sequelize 中使用“不同”?

如何在 Sequelize.js 中使用数据库连接池

如何通过sequelize在where语句中使用db函数

如何在 Sequelize Postgres 中使用小写函数

如何在 sequelize 中使用子查询来引用 self 表?

如何在 sequelize 中使用内连接