es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Sequelize – tengo que especificar “as” tanto en el modelo como en la consulta?

Esto parece redundante, y me obliga a codificar duro la misma cadena en dos lugares – o pegarla en una variable que tiene que ser pasada. De cualquier manera, si especifico el “as” de una relación en mi modelo, ¿por qué tengo que llamarlo después con la misma propiedad “as” al hacer consultas?

Mi relación:

organization.hasMany(client, { as: “Clients”, foreignKey: “organization_id” });
client.belongsTo(organization, { as: “AuthOrganization”, foreignKey: “organization_id” });

Consulta:

let data = await client.findOne({
include: [{ model: organization, as: “AuthOrganization” }]
}, { raw: true });

Si omito la misma propiedad “as”, se produce un error diciéndome que la incluya. Soy nuevo en Sequelize, pero parece que esto es así porque “as” se puede usar para identificar relaciones donde es ambiguo. Sin embargo, lo razonable sería que el valor que establezco en el modelo fuera el valor predeterminado, ¿no?

Lo que realmente quiero es esto, cuando escribo una consulta:

let data = await client.findOne({
include: organization
}, { raw: true });

Solo lo hago para evitar el guión bajo automático en los nombres de las funciones mixin. No soporté el horrible nombre de función “addAuth_organization”, y no encontré otra forma de solucionar este problema.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón por la que necesitas especificar la misma propiedad “as” en tu consulta que usaste en tu modelo es porque ayuda a Sequelize a identificar la relación correcta que debe usar cuando se unen las tablas. Esto es especialmente importante cuando tienes múltiples relaciones entre las mismas dos tablas.

    Aunque puede parecer redundante especificar la propiedad “as” dos veces, es necesario para evitar cualquier ambigüedad en la consulta. Si no lo especificas, Sequelize no sabrá qué relación usar y lanzará un error.

    En tu caso, puedes evitar usar la propiedad “as” en tu consulta simplemente incluyendo el modelo en sí en lugar de especificar la relación:

    let data = await client.findOne({
      include: organization
    }, { raw: true });
    

    Sin embargo, esto resultará en que Sequelize genere automáticamente nombres de función para las relaciones usando la convención de nomenclatura predeterminada (que mencionaste que encuentras “feo”). Si quieres usar nombres personalizados para tus funciones, deberás especificar la propiedad “as” tanto en tu modelo como en tu consulta.

Comments are closed.