Sequelizeを使用して、リレーションの列が条件を満たすすべての人を見つけるにはどうすればよいですか?
例として、著者の姓が「ヒッチコック」であるすべての書籍を検索します。本のスキーマには、著者のテーブルとのhasOne関係が含まれています。
編集:生のSQLクエリでこれをどのように行うことができるか理解していますが、別のアプローチを探しています
Sequelizeを使用して、特定の姓を持つBooks
ですべてのAuthor
を取得する方法の実際のサンプルを次に示します。モデルを定義し、それらを関連付け、データベースと同期して(テーブルを作成する)、それらの新しいテーブルにダミーデータを作成しているため、見た目よりもかなり複雑に見えます。コードの途中でfindAll
を探して、具体的に何を求めているかを確認してください。
module.exports = function(sequelize, DataTypes) {
var Author = sequelize.define('Author', {
id: {
type: DataTypes.INTEGER,
allowNull: false,
autoIncrement: true,
primaryKey: true
},
firstName: {
type: DataTypes.STRING
},
lastName: {
type: DataTypes.STRING
}
})
var Book = sequelize.define('Book', {
id: {
type: DataTypes.INTEGER,
allowNull: false,
autoIncrement: true,
primaryKey: true
},
title: {
type: DataTypes.STRING
}
})
var firstAuthor;
var secondAuthor;
Author.hasMany(Book)
Book.belongsTo(Author)
Author.sync({ force: true })
.then(function() {
return Book.sync({ force: true });
})
.then(function() {
return Author.create({firstName: 'Test', lastName: 'Testerson'});
})
.then(function(author1) {
firstAuthor=author1;
return Author.create({firstName: 'The Invisible', lastName: 'Hand'});
})
.then(function(author2) {
secondAuthor=author2
return Book.create({AuthorId: firstAuthor.id, title: 'A simple book'});
})
.then(function() {
return Book.create({AuthorId: firstAuthor.id, title: 'Another book'});
})
.then(function() {
return Book.create({AuthorId: secondAuthor.id, title: 'Some other book'});
})
.then(function() {
// This is the part you're after.
return Book.findAll({
where: {
'Authors.lastName': 'Testerson'
},
include: [
{model: Author, as: Author.tableName}
]
});
})
.then(function(books) {
console.log('There are ' + books.length + ' books by Test Testerson')
});
}
Sequilizeの最新バージョン(5.9.0)では、@ c.hillによって提案された方法は機能しません。
次に、次のことを行う必要があります。
return Book.findAll({
where: {
'$Authors.lastName$': 'Testerson'
},
include: [
{model: Author, as: Author.tableName}
]
});