web-dev-qa-db-ja.com

逐次化:左外部結合を使用して結合テーブルでWHERE条件を実行する方法

私のデータベースモデルは次のとおりです。
従業員が1台または0台の車を運転している
1人または複数の従業員が車両を運転できる
車両には、特に燃料の種類を伝えるモデルタイプがあります。

Picture of database diagram

車両を運転していないすべての従業員、または車両を運転している場合は車両がディーゼルではないすべての従業員を連行してもらいたいのですが。
そこで、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の答えは、それが機能するためには両方が必要だと気づいた。

17
Steve

where句を追加すると、sequelizeは自動的にrequired: true句をコードに追加します。

required: falseをインクルードセグメントに追加すると、問題が解決します

注:この問題を確認してください iss4019

13

熱心な読み込み

データベースからデータを取得する場合、同じクエリでassociationsも取得したいというかなりのチャンスがあります-これはeager loading。その背後にある基本的な考え方は、findまたはfindAllを呼び出すときの属性includeの使用です。あなたが設定したとき

必須:false

しましょう

LEFT OUTER JOIN

いつ

必須:true

しましょう

INNER JOIN

詳細については docs.sequelizejs eager-loading

5
Adiii