私のデータベースモデルは次のとおりです。
従業員が1台または0台の車を運転している
1人または複数の従業員が車両を運転できる
車両には、特に燃料の種類を伝えるモデルタイプがあります。
車両を運転していないすべての従業員、または車両を運転している場合は車両がディーゼルではないすべての従業員を連行してもらいたいのですが。
そこで、VehicleIDがnullの場合OR 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に左外部結合を実行すると同時に、結合されたテーブルの列がfalseまたはnullであることを示すwhere条件を設定する方法が必要です。
編集:
解決策は次のように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の答えは、それが機能するためには両方が必要だと気づいた。
where句を追加すると、sequelizeは自動的にrequired: true
句をコードに追加します。
required: false
をインクルードセグメントに追加すると、問題が解決します
注:この問題を確認してください iss4019
熱心な読み込み
データベースからデータを取得する場合、同じクエリでassociationsも取得したいというかなりのチャンスがあります-これはeager loading。その背後にある基本的な考え方は、findまたはfindAllを呼び出すときの属性includeの使用です。あなたが設定したとき
必須:false
しましょう
LEFT OUTER JOIN
いつ
必須:true
しましょう
INNER JOIN
詳細については docs.sequelizejs eager-loading