2017-04-13 2 views
0

je ces modèles:Sequelize joindre modèle source dans le modèle cible

module.exports = function(sequelize, DataTypes) { 
    const Tool = sequelize.define('Tool', { 
     Price: {type: DataTypes.STRING(255)}, 
     PurchaseDate: DataTypes.DATE, 
    }); 

    return Tool; 
}; 

module.exports = function(sequelize, DataTypes) { 
    const RepairOrder = sequelize.define('RepairOrder', { 
     OrderNumber: {type: DataTypes.STRING(255)} 
    }, { 
     classMethods: { 
     associate(models) { 
      RepairOrder.belongsTo(models.Tool, {as: 'Tool'}); 
     } 
     } 
    }); 

    return RepairOrder; 
}; 

module.exports = function(sequelize, DataTypes) { 
    const Hammer = sequelize.define('Hammer', { 
    Color: {type: DataTypes.STRING(255)} 
    }, 
    { 
    classMethods: { 
     associate(models) { 
     Hammer.belongsTo(models.Tool, {as: 'Tool'}); 
     } 
    } 
    }); 

    return Hammer; 
}; 

module.exports = function(sequelize, DataTypes) { 
    const Spanner = sequelize.define('Spanner', { 
    Size: {type: DataTypes.STRING(255)} 
    }, 
    { 
    classMethods: { 
     associate(models) { 
     Hammer.belongsTo(models.Tool, {as: 'Tool'}); 
     } 
    } 
    }); 

    return Spanner; 
}; 

En raison des méthodes belongsTo Marteau et Spanner ont une colonne ToolID. Maintenant, je veux recevoir tous les ordres de réparation avec les informations de l'outil, donc je joins les outils dans les ordres de réparation.

RepairOrder.findAll({ 
    attributes: ['ID', 'OrderNumber'], 
    include: [{ 
    model: Tool, as: 'Tool' 
    }] 
}); 

Mais je veux aussi savoir quel type (marteau ou Spanner) de l'outil est lors de la sélection de l'Ordre de réparation, alors comment puis-je me joindre à la fois dans l'outil? Quelque chose comme

RepairOrder.findAll({ 
     attributes: ['ID', 'OrderNumber'], 
     include: [{ 
     model: Tool, as: 'Tool', 
     include: [{'JOIN ON "Hammer"."ToolID" = "Tool"."ID"'}, 
        {'JOIN ON "Spanner"."ToolID" = "Tool"."ID"'}] 
     }] 
    }); 

Répondre

0

Vous ne pouvez pas, avec vos définitions actuelles du modèle. Vous obtiendrez probablement un message d'erreur indiquant que l'outil n'est pas associé à Hammer (ou Spanner).

Donc, vous devez modifier la définition de votre modèle comme ci-dessous: Dans votre modèle outil, inclure les associations suivantes:

Tool.hasMany(models.Hammer, {as: 'Tool'}); 
Tool.hasMany(models.Spanner, {as: 'Tool'}); 

Après cela, vous pouvez vous joindre outil sur marteau et bâtons dans les roues comme suit:

RepairOrder.findAll({ 
    attributes: ['ID', 'OrderNumber'], 
    include: { 
     model: Tool, as: 'Tool', 
     include: [{ 
     model: models.Hammer, 
     as: 'Tool' 
     }, { 
     model: models.Spanner, 
     as: 'Tool' 
     }] 
    } 
}); 
+0

Fonctionne parfaitement, merci. – frichter