Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

338
Vistas
Exclusión de resultados de la consulta Objetion/Knex según los resultados de withGraphFetched

Tengo dos modelos en Objeción: "marcas" y "ofertas".

Marca:

 const { Model } = require('objection') class Brand extends Model { static get tableName() { return 'brands' } ... static get relationMappings() { const Offer = require('./offer-model') return { offer: { relation: Model.HasManyRelation, modelClass: Offer, join: { from: 'brands.id', to: 'offers.brand_id' } } } } }

Oferta:

 const { Model } = require('objection') class Offer extends Model { static get tableName() { return 'offers' } }

Una marca tiene muchas ofertas, pero quiero obtener marcas que tengan al menos 1 oferta usando withGraphFetched, excluyendo las marcas que no tienen ofertas. Esto es lo que tengo hasta ahora:

 const brandModel = this.objection.models.brand const query = brandModel.query().withGraphFetched('offer') query.page(page, page_size) const offers = await query

Esto devuelve los datos "unidos", pero también devuelve las marcas que no tienen ofertas. Por ejemplo:

 [{ id:1, name: 'brand 1', offers: [{offerId: 1, offerName: 'offer 1'}] },{ id:2, name: 'brand 2', offers: [] }]

En los datos anteriores, no quiero que la marca con ID 2 esté en el conjunto de resultados.

Estoy usando Objeción/Knex para paginar los resultados, por lo que no puedo simplemente excluir las marcas con matrices de objetos vacías después de ejecutar la consulta.

Puedo lograr esto usando consultas sin procesar, pero eso significa que no puedo usar los atributos dinámicos de Objection y algunas otras partes clave de Objection.

¡Gracias!

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Simplemente puede agregar un whereExists a la consulta; algo como

 const query = brandModel.query() .withGraphFetched('offer') .whereExists( (qb) => qb.select('id').from('offers') .where('offers.brand_id', knex.ref('brands.id')) );

Aunque el bit de whereExists es directamente Knex, la consulta aún pasa por sus modelos, por lo que las cosas que ha definido allí aún deberían aplicarse (tal vez a menos que esté haciendo algo muy salvaje que afecta directamente las columnas utilizadas dentro de whereExists)

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda