gpt4 book ai didi

node.js - Sequelize - 从外部表中关联和选择

转载 作者:行者123 更新时间:2023-12-03 22:41:08 27 4
gpt4 key购买 nike

我使用 Sequalize 创建了 3 个 SQL 表,模式如下所示:
Loans

  • id: DataTypes.INTEGER ,
  • book_id: DataTypes.INTEGER ,
  • 赞助人 ID: DataTypes.INTEGER ,
  • 借出_on: DataTypes.DATE ,
  • return_by: DataTypes.DATE ,
  • 返回_on: DataTypes.DATE
  • Books
  • id: DataTypes.INTEGER ,
  • 标题: DataTypes.STRING ,
  • 作者: DataTypes.STRING ,
  • 类型: DataTypes.STRING ,
  • first_published: DataTypes.INTEGER
  • Patrons
  • id: DataTypes.INTEGER ,
  • first_name: DataTypes.STRING ,
  • 姓氏: DataTypes.STRING ,
  • 地址: DataTypes.STRING ,
  • 电子邮件: DataTypes.STRING ,
  • library_id: DataTypes.STRING ,
  • 邮政编码:DataTypes.INTEGER

  • 我的目标是使用 Loans 查询 Sequalize 表,由 SQLite 生成的 Sequalize 查询应如下所示:
    SELECT 
    book.title AS book,
    patron.first_name||' '||patron.last_name AS patron,
    loaned_on,
    return_by,
    returned_on
    FROM loans
    JOIN books ON loans.book_id=books.id
    JOIN patrons ON loans.patron_id=patrons.id

    这是我的尝试:
    // Datebase relations
    books.hasMany(loans, {
    foreignKey: 'book_id'
    });
    loans.belongsTo(books, {
    foreignKey: 'book_id'
    });
    patrons.hasMany(loans, {
    foreignKey: 'patron_id'
    });
    loans.belongsTo(patrons, {
    foreignKey: 'patron_id'
    });

    // All Loans page
    router.get('/all_loans', function(req, res, next) {
    loans.findAll({
    attributes: [
    [Sequelize.col('book.title'), 'book'],
    [sequelize.literal("patron.first_name||' '||patron.last_name"), 'patron'],
    'loaned_on',
    'return_by',
    'returned_on'
    ],
    include: [books, patrons]
    }).then();

    res.render('all_loans', {
    title: "All Loans"
    });
    });

    上面的代码生成了这个:
    SELECT 
    `loan`.`id`, 
    `book`.`title` AS `book`, 
    patron.first_name||' '||patron.last_name AS `patron`, 
    `loan`.`loaned_on`, 
    `loan`.`return_by`, 
    `loan`.`returned_on`, 
    `book`.`id` AS `book.id`, 
    `book`.`title` AS `book.title`, 
    `book`.`author` AS `book.author`, 
    `book`.`genre` AS `book.genre`, 
    `book`.`first_published` AS `book.first_published`, 
    `book`.`createdAt` AS `book.createdAt`, 
    `book`.`updatedAt` AS `book.updatedAt`, 
    `patron`.`id` AS `patron.id`, 
    `patron`.`first_name` AS `patron.first_name`, 
    `patron`.`last_name` AS `patron.last_name`, 
    `patron`.`address` AS `patron.address`, 
    `patron`.`email` AS `patron.email`, 
    `patron`.`library_id` AS `patron.library_id`, 
    `patron`.`zip_code` AS `patron.zip_code`, 
    `patron`.`createdAt` AS `patron.createdAt`, 
    `patron`.`updatedAt` AS `patron.updatedAt` 
    FROM `loans` AS `loan` 
    LEFT OUTER JOIN `books` AS `book` ON `loan`.`book_id` = `book`.`id` 
    LEFT OUTER JOIN `patrons` AS `patron` ON `loan`.`patron_id` = `patron`.`id`;

    该查询还从 bookspatrons 表中提取了我不打算指定的所有列。

    最佳答案

    经过一番研究,我想出了如何修复我的 Sequalize 代码:

    loans.findAll({
    attributes: [
    [Sequelize.col('book.title'), 'book_title'],
    [sequelize.literal("patron.first_name||' '||patron.last_name"), 'patron_name'],
    'loaned_on',
    'return_by',
    'returned_on'
    ],
    include: [{
    model: books,
    attributes: []
    }, {
    model: patrons,
    attributes: []
    }]
    }).then(results => {
    console.dir(results);
    });

    它成功地生成了以下 SQLite 代码:
    SELECT 
    `loan`.`id`, 
    `book`.`title` AS `book_title`, 
    patron.first_name||' '||patron.last_name AS `patron_name`, 
    `loan`.`loaned_on`, 
    `loan`.`return_by`, 
    `loan`.`returned_on` 
    FROM `loans` AS `loan` 
    LEFT OUTER JOIN `books` AS `book` ON `loan`.`book_id` = `book`.`id` 
    LEFT OUTER JOIN `patrons` AS `patron` ON `loan`.`patron_id` = `patron`.`id`;

    似乎我不能将 book.title 别名为 bookpatron.first_name||' '||patron.last_namepatron,因为这些别名稍后会在查询中使用。

    关于node.js - Sequelize - 从外部表中关联和选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45293182/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com