考虑此请求(针对 Postgres)
var customers = await database.Customer.findAll({
attributes: [ 'idcustomer', 'firstname', 'lastname' ],
include: [
{
model: database.Telephone, as: "Telephones",
attributes: [ 'number' ],
where: { number: { [database.sequelize.Op.eq]: req.body.telephone } }
}
],
where: { [database.sequelize.Op.or]: [
{ firstname: { [database.sequelize.Op.iLike]: req.body.firstname} },
{ lastname: { [database.sequelize.Op.iLike]: req.body.lastname} },
{ email: { [database.sequelize.Op.iLike]: req.body.email } }
] }
});
我想要实现的是按名字和姓氏/电子邮件/电话号码查询客户,我们称它们为 F、L、E 和 T。此查询基本上选择 T & (F | L | E) 的所有用户,但是,我想要达到的是 (F | L | E | T)。
代码过滤器中参数的底部在前面加上“Customer”。到参数,因此不可能将数字与其余比较进行分组。有解决方法吗?
生成的 SQL:
SELECT
"Customer"."idcustomer", "Customer"."firstname", "Customer"."lastname",
"Telephones"."number" AS "Telephones.number"
FROM "Customer" AS "Customer"
INNER JOIN "Telephone" AS "Telephones"
ON "Customer"."idcustomer" = "Telephones"."customer" AND "Telephones"."number" = ''
WHERE
("Customer"."firstname" ILIKE '' OR "Customer"."lastname" ILIKE '' OR "Customer"."email" ILIKE '');
最佳答案
您可以使用 Sequelize.col() 来引用包含的行:
var customers = await database.Customer.findAll({
attributes: [ 'idcustomer', 'firstname', 'lastname' ],
include: [
{
model: database.Telephone,
as: "Telephones",
attributes: [ 'number' ]
}
],
where: { [database.sequelize.Op.or]: [
{
telephone: Sequelize.where(Sequelize.col(`"Telephones".number`), {
[database.sequelize.Op.eq]: req.body.telephone
})
},
{ firstname: { [database.sequelize.Op.iLike]: req.body.firstname} },
{ lastname: { [database.sequelize.Op.iLike]: req.body.lastname} },
{ email: { [database.sequelize.Op.iLike]: req.body.email } }
] }
});
关于javascript - Sequelize - 嵌套在相互覆盖的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51406425/