Как автоматически включить `.withGraphFetched ()` для всех запросов модели в возражении. js - PullRequest
1 голос
/ 30 апреля 2020

У меня определена следующая модель:

import db from "../connection.js";
import objection from "objection";
const { Model } = objection;

Model.knex(db);

class User extends Model {
  static get tableName() {
    return "users";
  }

  static get relationMappings() {
    return {
      emails: {
        relation: Model.HasManyRelation,
        modelClass: Email,
        join: {
          from: "users.id",
          to: "emails.user_id",
        }
      }
    }
  }
}

class Email extends Model {
  static get tableName() {
    return "emails";
  }

  static get relationMappings() {
    return {
      user: {
        relation: Model.BelongsToOneRelation,
        modelClass: User,
        join: {
          from: "emails.user_id",
          to: "users.id",
        },
      },
    };
  }
}

И для запроса User с их адресами электронной почты потребуется withGraphFetched(), чтобы каждый раз явно запускаться как:

const myUser = await User.query().withGraphFetched("emails").findById(1)

Мне не удалось выяснить, что написать в определении модели, чтобы сделать это возможным, и я не вижу таких примеров в Интернете. Возможно ли ВСЕГДА автоматически включать в запрос withGraphFetched("emails"), чтобы его не нужно было каждый раз явно записывать?

1 Ответ

2 голосов
/ 30 апреля 2020

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

Обычной практикой является добавление метода к этому конкретному c случаю:

class User extends Model {
  static get tableName() {
    return "users";
  }

  static get relationMappings() {
    return {
      emails: {
        relation: Model.HasManyRelation,
        modelClass: Email,
        join: {
          from: "users.id",
          to: "emails.user_id",
        }
      }
    }
  }

  static async getUser (id) { // Or maybe getUserWithEmails
      return await this.query().withGraphFetched("emails").findById(id)
  }
}

Тогда вы можете просто:

const myUser = await User.getUser(id)
...