鉴于以下简单模型:
class A extends Model {}
A.init({
aField: DataTypes.STRING,
}, { sequelize });
class B extends Model {}
B.init({
bField: DataTypes.STRING,
}, { sequelize });
A.hasMany(B); // this creates the B.AId column
// populate
await A.create({
aField: 'fooA',
Bs: [{ bField: 'fooB' }]
}, { include: [B] });
await A.create({ aField: 'barA' });
await A.create({ aField: 'bazA' });
我不知道如何选择第一个没有 B 条目的 A 模型实例。
前一种情况,只返回barA
和bazA
。
以下不起作用,它返回foo
:
await A.findOne({
include: [{
model: B,
required: false,
where: {
'AId': null,
}
}],
});
生成的查询是: SELECT A.*, Bs.id AS Bs.id, Bs.bField AS Bs.bField, Bs.AId AS Bs.AId FROM (SELECT A.id, A.aField FROM As AS A LIMIT 1) AS A LEFT OUTER JOIN Bs AS Bs ON A.id = Bs.AId AND Bs.AId IS NULL
这是限制和关联的问题。类似问题:https : //github.com/sequelize/sequelize/issues/7585
Sequelize 将关联转换为子查询,但在您的用例中,您需要一个关联然后限制整体关联结果。为此,您可以使用subQuery: false
禁用子查询。
await A.findOne({
include: [{
model: B,
required: false,
where: {
'AId': null,
}
}],
subQuery: false
});
这仍然不能达到你想要什么,因为where
在include
将生成AND
的条件ON
。
生成的查询:
SELECT `A`.`id`, `A`.`aField`, `A`.`createdAt`, `A`.`updatedAt`, `Bs`.`id` AS `Bs.id`,
`Bs`.`bField` AS `Bs.bField`, `Bs`.`createdAt` AS `Bs.createdAt`,
`Bs`.`updatedAt` AS `Bs.updatedAt`, `Bs`.`AId` AS `Bs.AId`
FROM `As` AS `A`
LEFT OUTER JOIN `Bs` AS `Bs` ON `A`.`id` = `Bs`.`AId` AND `Bs`.`AId` IS NULL
LIMIT 1;
你想要的是
...
... ON `A`.`id` = `Bs`.`AId` WHERE `Bs`.`AId` IS NULL
LIMIT 1;
为了得到这个WHERE
,你可以把where
子句 for A
.
await A.findOne({
include: [{
model: B,
required: false
}],
where: {
'$Bs.AId$': null
},
subQuery: false
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句