我有以下型号:
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,它给出了一个左外连接.在这种情况下,我得到一些不匹配的结果.省略了where子句.
最佳答案
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 level where with eagerly loaded models的示例,你的squizzle查询可能应该是这样的
Author.findOne({
where: {
[Op.or]: [
{'$author.name$': 'search string'},{ '$Book.title$': 'search string'}
]
},include: [{
model: Book,required: false
}]})