Quiero obtener una consulta como esta con la secuela de ORM:
SELECT "A".*,
FROM "A"
LEFT OUTER JOIN "B" ON "A"."bId" = "B"."id"
LEFT OUTER JOIN "C" ON "A"."cId" = "C"."id"
WHERE ("B"."userId" = '100'
OR "C"."userId" = '100')
El problema es que la secuela no me permite hacer referencia a la tabla “B” o “C” en la cláusula where. siguiente código
A.findAll({
include: [{
model: B,
where: {
userId: 100
},
required: false
}, {
model: C,
where: {
userId: 100
},
required: false
}]
]
me da
SELECT "A".*,
FROM "A"
LEFT OUTER JOIN "B" ON "A"."bId" = "B"."id" AND "B"."userId" = 100
LEFT OUTER JOIN "C" ON "A"."cId" = "C"."id" AND "C"."userId" = 100
que es una consulta completamente diferente, y el resultado de
A.findAll({
where: {
$or: [
{'"B"."userId"' : 100},
{'"C"."userId"' : 100}
]
},
include: [{
model: B,
required: false
}, {
model: C,
required: false
}]
]
ni siquiera es una consulta válida:
SELECT "A".*,
FROM "A"
LEFT OUTER JOIN "B" ON "A"."bId" = "B"."id"
LEFT OUTER JOIN "C" ON "A"."cId" = "C"."id"
WHERE ("A"."B.userId" = '100'
OR "A"."C.userId" = '100')
¿Es posible la primera consulta con la secuencia, o debería ceñirme a las consultas sin formato?
Envuelva las columnas que hacen referencia a las tablas unidas en $$
A.findAll({
where: {
$or: [
{'$B.userId$' : 100},
{'$C.userId$' : 100}
]
},
include: [{
model: B,
required: false
}, {
model: C,
required: false
}]
});
-
Todo falla si agrego otro include, es decir
{required: true}
. Luego, la secuencia hace una subconsulta con INNER JOIN y coloca la cláusula WHERE dentro. Por lo tanto, eso genera una consulta no válida. SELECCIONE “A”.*, DESDE (SELECCIONE * DESDE “A” INTERNO ÚNASE “D” EN “A”.”dId” = “D”.”id” DONDE (“A”.”B.userId” = ‘100 ‘ O “A”.”C.userId” = ‘100’) ) como “A” UNIÓN EXTERNA IZQUIERDA “B” ON “A”.”bId” = “B”.”id” UNIÓN EXTERNA IZQUIERDA “C” ON “A”.”cId” = “C”.”id” ¿Alguna sugerencia sobre cómo resolver esto?– xb1itz
15 de septiembre de 2016 a las 8:19
-
¿Esta sintaxis de $$ está documentada en alguna parte?
– Brad Decker
19 de diciembre de 2016 a las 21:09
-
@xb1itz ¿Tuviste suerte resolviendo el problema con una segunda unión? Me estoy encontrando con esto también.
–Eric Conner
10 de enero de 2018 a las 0:46
-
Documentado aquí: docs.sequelizejs.com/manual/tutorial/… en “Nivel superior donde con modelos cargados ansiosamente”
– Miguel
4 de marzo de 2018 a las 17:11
-
Funciona como está, pero se rompe si trato de agregar
limit
.– Iván Rubinson
28 de enero de 2019 a las 10:56
Agregue la condición where en el include, junto con join.
{
model: C,
where: {
id: 1
}
}
-
Asegúrate de agregar
required: true
aquí si quieres usarlo como un filtro “Y”– mienaikoe
28 de marzo de 2021 a las 21:24
pregunta muy util!
– apropiados
16 oct 2018 a las 9:30
Actualizando la respuesta de (Jan Aagaard Meier), agregue
subQuery=false
opción para trabajar con límite y compensación– Ser espectador
4 de febrero de 2020 a las 6:55