Sequelize 的findAndCountAll 中 include 的使用疑问
发布于 7 年前 作者 thomas0836 10059 次浏览 来自 问答
const Sequelize = require('sequelize')
var Person = db.define('person', {
    firstName: {type: Sequelize.STRING}
});
var Personmark = db.define('personmark', {
    userId: {type: Sequelize.INTEGER}
});

Person.hasMany(Personmark,{constraints: false})


yield Person.findAndCountAll({
	include :[{
                model: Personmark,
                where: {userId : 1},
                required: false
            }]
})

我这边有两个表,一个Person 表,一个 Personmark表,一个Person 会有 多个 Personmark, 现在我想找出在Personmark有特定userId 的 Person ,想达到的 sql 效果为

SELECT count(1) 
from people p, personmarks pm
where p.id = pm.personId
and pm.userId = 1;

参考 api 在 findAndCountAll 中使用 include 然后 中间再带个 where 结果的sql 为

SELECT count(`person`.`id`) AS `count` FROM `people` AS `person` LEFT OUTER JOIN `personmarks` AS `personmarks` ON `person`.`id` = `personmarks`.`personId` AND `personmarks`.`userId` = '1';

这两个sql 的结果 完全不同, 符合 Personmark.userId = 1 的数据其实只有一条。 而 findAndCountAll 的结果 是 整个表的数据。

请问 该怎么使用Sequelize 来达到我想要的那个效果?

5 回复

把required: false 删除了就没事了。不过,搜索1对多的结果的时候,就出现 多条记录。 就是说 person = { firstName : ‘a’, id : 1 } personmark = [ {userId: 1, personId: 1} , {userId: 2, personId: 1}, {userId: 3, personId: 2}, {userId: 4, personId: 5}]

当我搜索

yield Person.findAndCountAll({
	include :[{
                model: Personmark,
                where: {userId : {$in: [1,2]}}
            }]
})

出来的结果会是两条,我想只返回一条 penson 的数据,那该怎么写?

简单点,提问的方式简单点。。。

我也看得好晕啊,直接用SQL不行么?

遇到多表关联我觉得还是用原生写的好,sequelize的用法十分拙计。

写成

yield Person.findAndCountAll({
	include :[{
                model: Personmark,
                where: {userId : {$in: [1,2]}}
            }],
	distinct: true
})

应该就可以了

回到顶部