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 来达到我想要的那个效果?
把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
})
应该就可以了