結合テーブルの属性でクエリをフィルタリングしようとしています
2つのテーブルCitiesとCategoriesがあり、3つ目のテーブルCityCategoryを介して関連付けています。アイデアは、CityCategory
.year
が特定の整数である場合に、都市に関連付けられたカテゴリを取得することです。
これは、関連付けを指定する方法です。
module.exports = function(sequelize, DataTypes) {
var CityCategory = sequelize.define('CityCategory', {
year: {
type: DataTypes.INTEGER,
allowNull: false,
validate: {
notNull: true
}
}
}, {
indexes: [{
unique: true,
fields: ['CityId', 'CategoryId', 'year']
}]
});
return CityCategory;
};
City.belongsToMany(models.Category, {
through: {
model: models.CityCategory
}
});
Category.belongsToMany(models.City, {
through: {
model: models.CityCategory
}
});
これは私が現在使用しているクエリですが、使用できませんでした。
City.find({
where: {id: req.params.id},
attributes: ['id', 'name'],
include: [{
model: Category,
where: {year: 2015},
attributes: ['id', 'name', 'year']
}]
})
.then(function(city) {
...
});
残念ながら、カテゴリモデルで「year」という属性を検索する代わりに、CityCategoryのyear属性を使用するようにsequelizeに指示する方法がわかりません...
Unhandled rejection SequelizeDatabaseError: ER_BAD_FIELD_ERROR: Unknown column 'Category.CityCategory.year' in 'where clause'
これは可能ですか、それともカスタムクエリを手動で作成する必要がありますか?
よろしくお願いします!
編集
私はもう少し遊んでいて、解決策を見つけました!少し乱雑に見えるので、もっと良い方法があるはずだと思います。
City.find({
where: {id: req.params.id},
attributes: ['id', 'name'],
include: [{
model: Category,
where: [
'`Categories.CityCategory`.`year` = 2015'
],
attributes: ['id', 'name', 'year']
}]
})
.then(function(city) {
...
});
スルーテーブルをクエリするときは、through.where
を使用する必要があります
include: [{
model: Category,
through: { where: {year: 2015}},
attributes: ['id']
}]
required: true
を追加して、インクルードを内部結合に変えることができます。
Sequelize v3の場合、構文は提案したものに近いようです。つまり、次のようになります。
include: [{
model: Category,
where: {year: 2015},
attributes: ['id']
}]