Bookshelf hasMany()。through()参数被忽略

时间:2016-05-19 00:59:08

标签: bookshelf.js

我有一个非常传统的Course模型。我也有一个Book模型。在他们之间,我有一个CourseMaterial模型。

我尝试将Course模型配置为Course.hasMany('Book').through('CourseMaterial'),但由于某些非常规内容,我需要指定每个密钥。表格如此加入:

  • courses表格有id
  • courseMaterials表格为FK,course_id引用courses.id
  • course_materials表格中有identifier字段,出于本讨论的目的,该字段包含ISBN值。
  • books表格有一个isbn表格,其值与course_materials.identifier中的内容相匹配。

在我的Course模型中,我的关系如下:

books: function() {
    return this.hasMany('Book')
        .through('CourseMaterial', 'isbn', 'identifier');
},

生成的SQL似乎忽略了第三个参数:

SELECT `books`.*, 
       `course_materials`.`id` AS `_pivot_id`, 
       `course_materials`.`course_id` AS `_pivot_course_id` 
  FROM `books` 
        INNER JOIN `course_materials` 
                ON `course_materials`.`id` = `books`.`isbn`

为什么要尝试加入course_materials.id而非加入course_materials.identifier?我误读了文档吗?

1 个答案:

答案 0 :(得分:0)

根据以下链接,这是一个现有问题:

https://github.com/tgriesser/bookshelf/issues/673

因此书架库忽略了第三个参数。

解决方案是使用knex构建自定义SQL,如下所示定义每个步骤:

knex('books').innerJoin('CourseMaterial', 'CourseMaterial.identifier', 'books.isbn')

OR (in case you want to do projection on results)

knex('books').select(['books.id', 'books.bookname'])
.innerJoin('CourseMaterial', 'CourseMaterial.identifier', 'books.isbn')