Исключение результатов из запроса возражения/Knex на основе результатов, полученных с помощью withGraphFetched

#javascript #node.js #database #knex.js #objection.js

Вопрос:

У меня есть две модели в возражении — «бренды» и «предложения».

Бренд:

 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' }  }  }  } }  

Предложение:

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

У бренда много предложений, но я хочу получить бренды, у которых есть хотя бы 1 предложение, используя withGraphFetched, исключая бренды, у которых нет предложений. Вот что у меня есть до сих пор:

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

Это возвращает «присоединенные» данные, но также возвращает бренды, у которых нет предложений. Например:

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

В приведенных выше данных я не хочу, чтобы бренд с идентификатором 2 был в результирующем наборе.

Я использую возражение/Knex для разбиения результатов на страницы, поэтому я не могу просто исключить бренды с пустыми массивами объектов после выполнения запроса.

Я могу добиться этого с помощью необработанных запросов, но это означает, что я не могу использовать динамические атрибуты Возражения и несколько других ключевых частей Возражения.

Спасибо!

Ответ №1:

Вы можете просто добавить в запрос whereExists; что-то вроде

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

Даже несмотря на то, что бит whereExists является прямым Knex, запрос все равно проходит через ваши модели, поэтому то, что вы там определили, все равно должно применяться (возможно, если вы не делаете что-то очень дикое, что напрямую влияет на столбцы, используемые внутри whereExists)