2016-03-31 1 views
0

У меня есть модель продукта, который связан с таблицей Medias с отношением hasMany:Sequelize запрос на модели, где граф hasMany пуст

Product.hasMany(models.Media, { 
    foreignKey: 'mediableId', 
    constraints: false, 
    scope: { 
     mediable: 'product' 
    }, 
    as: 'medias' 
}); 

Я ищу способ запрашивая все продукты с нулевыми СМИ, как это можно сделать с помощью Sequelize? Возможно ли это без необработанного запроса?

ответ

1

Вы можете использовать необработанный запрос для предложения where.

Например, предполагается, что ваш Product модель определяется следующим образом:

module.exports = (sequelize, DataTypes) => sequelize.define('products', { 
    id: { 
     type: DataTypes.INTEGER, 
     allowNull: false, 
     primaryKey: true, 
     autoIncrement: true 
    }, 
    name: { 
     type: DataTypes.STRING, 
     allowNull: true 
    } 
}, { 
    tableName: 'products', 
    freezeTableName: true, 
    underscored: true, 
    classMethods: { 
     associate: models => { 
      models.products.hasMany(models.medias, { 
       foreignKey: 'mediable_id', 
       constraints: false, 
       scope: { 
        mediable: 'product' 
       } 
      }); 
     } 
    } 
}); 

и ваша модель Media определяется как:

module.exports = (sequelize, DataTypes) => sequelize.define('medias', { 
    id: { 
     type: DataTypes.INTEGER, 
     allowNull: false, 
     primaryKey: true, 
     autoIncrement: true 
    }, 
    name: { 
     type: DataTypes.STRING, 
     allowNull: true 
    }, 
    mediable: { 
     type: DataTypes.STRING, 
     allowNull: true 
    }, 
    mediable_id: { 
     type: DataTypes.INTEGER, 
     allowNull: true 
    } 
}, { 
    tableName: 'medias', 
    freezeTableName: true, 
    underscored: true, 
    classMethods: { 
     associate: models => { 
      models.products.belongsTo(models.products, { 
       foreignKey: 'id', 
       constraints: false 
      }); 
     } 
    } 
}); 

, то вы можете запросить его так:

sequelize.sync().then(() => Promise.all([ 

    // Prepopulate Data 
    models.products.upsert({ 
     id: 1, 
     name: 'Product A' 
    }), 
    models.products.upsert({ 
     id: 2, 
     name: 'Product B' 
    }), 
    models.products.upsert({ 
     id: 3, 
     name: 'Product C' 
    }), 

    models.medias.upsert({ 
     id: 1, 
     name: 'Media A', 
     mediable: 'item', 
     mediable_id: 1 
    }), 
    models.medias.upsert({ 
     id: 2, 
     name: 'Media B', 
     mediable: 'product', 
     mediable_id: 1 
    }), 
    models.medias.upsert({ 
     id: 3, 
     name: 'Media C', 
     mediable: 'product', 
     mediable_id: 1 
    }), 
    models.medias.upsert({ 
     id: 4, 
     name: 'Media D', 
     mediable: 'product', 
     mediable_id: 2 
    }), 
    models.medias.upsert({ 
     id: 5, 
     name: 'Media E' 
    }) 

])).then(() => models.products.findAll({ 
    where: ["medias.mediable_id IS NULL OR medias.mediable != 'product'"], 
    include: [{ 
     model: models.medias, 
     required: false, 
    }] 
})).then(products => { 
    // The rest of your logic here... 
}); 
Смежные вопросы