Sequelize:如何使用左外连接对连接表执行WHERE条件
我的数据库模型如下:
一名员工驾驶一辆或零辆车
一辆车可以由一名或多名员工驾驶
车辆有一个模型types,告诉我们它的燃料types等。
我想继续把我们所有的员工带到不驾驶车辆的地方,或者如果他们这样做,那么车辆不是柴油的。
那么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。
编辑:
事实certificate,解决scheme是使用required:false,如下所示:
options.include = [{ model: model.Vehicle, attributes: ['ID', 'ModelID'], include: [ { model: model.VehicleModel, attributes: ['ID', 'IsDiesel'] where: { IsDiesel: false }, required: false }], required: false }];
我已经尝试了第一个“必需:虚假”,但我错过了内在的一个。 我认为这是行不通的,所以我放弃了这个方法。 Dajalmar Gutierrez的回答让我意识到我需要这两个工作。
当你添加一个where子句时,sequelize会自动在你的代码中添加一个required: true
子句。
如果required: false
添加required: false
,则可以解决问题
注意:你应该检查这个问题iss4019
急切的加载
当您从数据库中检索数据时,您也希望获得相同查询的相关性 – 这被称为“ 急切加载” 。 背后的基本思想是在调用find或findAll时使用属性include。 当你设置
required:false
会做
LEFT OUTER JOIN
什么时候
required:true
会做
INNER JOIN
欲了解更多信息docs.sequelizejs急切加载