簡體   English   中英

如何在where子句中使用帶有可選include的運算符?

[英]How to use an operator in where clause with an optional include?

我有以下型號:

AuthorModel.hasMany(BookModel);
BookModel.belongsTo(AuthorModel);

有些作者沒有書。

我想選擇一個作者,他的一本書的名字或頭銜與搜索字符串相匹配。

我可以通過以下聲明來實現這一點,但僅限於在BookModel中擁有書籍的作者

       Author.findOne({
         include: [{
            model: Book,
            where: {
              [Op.or]: [
                  {'$author.name$': 'search string'},
                  { title: 'search string'}
                 ]
               },
             }]
           })

這給了我或多或少的以下mysql查詢:

SELECT 
    `author`.`name`,
    `book`.`title`
FROM `author` INNER JOIN `book` 
     ON `author`.`id` = `book`.`authorId`
     AND ( `author`.`name` = 'search string' OR `book`.`title` = 'search string');

這里的問題是,如果作者沒有書籍,那么結果是空的。 即使有作者符合搜索條件。

我試圖將include設置為required: false ,它給出了一個left outer join 在這種情況下,我得到一些不匹配的結果。 省略了where子句。

我如何更改我的sequelize查詢,或者什么是正確的mysql查詢?

MySql查詢可能應該是這樣的

SELECT 
    `author`.`name`,
    `book`.`title`
FROM `author` LEFT JOIN `book` 
     ON `author`.`id` = `book`.`authorId`
WHERE ( `author`.`name` = 'search string' OR `book`.`title` = 'search string')

注意這里的過濾條件是如何在WHERE而不是JOIN ... ON子句的一部分

基於Top級別的示例,在那里使用急切加載的模型,你可能會看到類似的問題

Author.findOne({
    where: {
          [Op.or]: [
              {'$author.name$': 'search string'},
              { '$Book.title$': 'search string'}
             ]
           },
    include: [{
        model: Book,           
        required: false
       }]})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM