【问题标题】:Sequelize: how to do a WHERE condition on joined table with left outer joinSequelize:如何使用左外连接对连接表执行 WHERE 条件
【发布时间】:2016-09-23 10:11:50
【问题描述】:

我的数据库模型如下:
一名员工驾驶一辆或零辆汽车
一辆车可由一名或多名员工驾驶
车辆有一个模型类型,可以告诉我们它的燃料类型等等。

我想在他们不开车的情况下将所有员工带回给我,或者如果他们开车,那么车辆不是柴油车。
因此,VehicleID 为 null 或 Vehicle.VehicleModel.IsDiesel = false

我目前的代码如下:

var employee = sequelize.define('employee', {
    ID: Sequelize.INTEGER,
    VehicleID: Sequelize.INTEGER
});

var vehicle = sequelize.define('vehicle', {
    ID: Sequelize.INTEGER,
    ModelID: Sequelize.INTEGER
});

var vehicleModel = sequelize.define('vehicleModel', {
    ID: Sequelize.INTEGER,
    IsDiesel: Sequelize.BOOLEAN
});

employee.belongsTo(vehicle);
vehicle.belongsTo(vehicleModel);

如果我运行以下命令:

options.include = [{
    model: model.Vehicle,
    attributes: ['ID', 'ModelID'],
        include: [
        {
            model: model.VehicleModel,
            attributes: ['ID', 'IsDiesel']
        }]
}];

employee
 .findAll(options)
 .success(function(results) {
     // do stuff
 });

Sequelize 执行左外连接以获取包含的表。所以我找到了会开车和不开车的员工。
只要我在选项中添加位置:

options.include = [{
    model: model.Vehicle,
    attributes: ['ID', 'ModelID'],
    include: [
        {
            model: model.VehicleModel,
            attributes: ['ID', 'IsDiesel']
            where: {
                IsDiesel: false
            }
        }]
}];

Sequelize 现在执行内部连接以获取包含的表。
这意味着我只聘请驾驶车辆且车辆不是柴油的员工。不开车的员工被排除在外。

从根本上说,我需要一种方法来告诉 Sequelize 进行左外连接,同时有一个 where 条件表明连接表中的列为 false 或 null。

编辑:

原来解决办法是使用required:false,如下:

options.include = [{
    model: model.Vehicle,
    attributes: ['ID', 'ModelID'],
    include: [
        {
            model: model.VehicleModel,
            attributes: ['ID', 'IsDiesel']
            where: {
                IsDiesel: false
            },
            required: false
        }],
    required: false

}];

我已经尝试过放置第一个 'required:false' 但我错过了放置内部的。我认为它不起作用,所以我放弃了这种方法。 Dajalmar Gutierrez 的回答让我意识到我需要两者才能正常工作。

【问题讨论】:

    标签: javascript node.js sequelize.js


    【解决方案1】:

    当您添加 where 子句时,sequelize 会自动将 required: true 子句添加到您的代码中。

    required: false 添加到您的包含段应该可以解决问题

    注意:你应该检查这个问题iss4019

    【讨论】:

    • 已解决。非常感谢。我已经编辑了我的帖子以显示正确的解决方案。您链接到的页面上的关键语句是:“我包含嵌套包含,我错过了一个嵌套包含中的 require: false 子句.. 设置它使代码工作”。读完之后,我意识到我做了同样的事情。
    【解决方案2】:

    预加载

    当您从数据库中检索数据时,您很有可能还希望获得具有相同查询的关联 - 这称为急切加载。这背后的基本思想是在调用 find 或 findAll 时使用属性 include。 当你设置

    必填:假

    会的

    LEFT OUTER JOIN
    

    什么时候

    必填:真

    会的

    INNER JOIN
    

    更多详情docs.sequelizejs eager-loading

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      相关资源
      最近更新 更多