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 queryEsto 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!
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)