web-dev-qa-db-ja.com

関連付けに基づいて検索をシーケンシャル化

Sequelizeを使用して、リレーションの列が条件を満たすすべての人を見つけるにはどうすればよいですか?

例として、著者の姓が「ヒッチコック」であるすべての書籍を検索します。本のスキーマには、著者のテーブルとのhasOne関係が含まれています。

編集:生のSQLクエリでこれをどのように行うことができるか理解していますが、別のアプローチを探しています

34
futbolpal

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')
        });
  }
28
c.hill

Sequilizeの最新バージョン(5.9.0)では、@ c.hillによって提案された方法は機能しません。

次に、次のことを行う必要があります。

return Book.findAll({
    where: {
        '$Authors.lastName$': 'Testerson'
    },
    include: [
        {model: Author, as: Author.tableName}
    ]
});
2
Adam