Saltar al contenido

Sequelize.js: unir tablas sin asociaciones

Solución:

Parece que si bien es posible definir una costumbre on condición, no es posible include relaciones sin definir asociaciones primero. Esto está implícito en la redacción de la documentación para findAll método (buscar options.include en la página):

Una lista de asociaciones para cargar con entusiasmo usando una combinación izquierda. Se admite {incluir: [ Model1, Model2, …]} o {incluyen: [{ model: Model1, as: ‘Alias’ }]} o {incluyen: [‘Alias’]}. Si su asociación está configurada con un as (por ejemplo, X.hasMany (Y, {as: ‘Z}, debe especificar Z en el atributo as cuando esté ansioso por cargar Y).

Los documentos en options.include[].on son aún más concisos:

Proporcione su propia condición ON para la unión.

Terminé resolviendo mi problema usando las vistas de Postgres como solución. También es posible inyectar una consulta sin procesar y eludir las limitaciones de secuenciación, pero lo usaría solo como un truco de desarrollo / creación de prototipos y se me ocurrirá algo más robusto / seguro en la producción; algo como vistas o procedimientos almacenados.

Para cualquiera que termine buscando en Google aquí: hay una solución, no estoy seguro de que estuviera disponible en ese entonces, pero a partir de la versión 5.21.7 funciona. puede pasar el objeto de asociación para incluir el parámetro:

const res = await bank.findAll({
        include: [
            {
                model: account,
                association: new HasMany(bank, account, {/*options*/}),
            },
        ],
    })

HasMany es un constructor de asociaciones, que puede tomarse de Sequelize.Associations o sequelize instance. también hay otros constructores de asociaciones allí. Para TS, necesitará lanzar manualmente ya que esa propiedad no está en tipos.

UPD: para BelongsToMany necesita llamar _injectAttributes() sobre el uso anterior de la asociación, y no verifiqué otros aparte de HasMany.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *