Donde condición para la tabla unida en Sequelize ORM

2 minutos de lectura

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?

  • 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

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

¿Ha sido útil esta solución?