Как управлять каскадными семенами и фабриками в AdonisJS?

Я настраиваю новое приложение, которое я разрабатываю с использованием фреймворка AdonisJS, я нахожусь в процессе создания начальных значений и фабрик для моих моделей, чтобы легко вручную вводить данные в базу данных. Тем не менее, мои модели связаны друг с другом, и я получаю ошибки, пытаясь добиться полного заполнения. Я уже прочитал документацию по Adonis, но она мне пока не ясна.

Это пример схемы, которую я пытаюсь реализовать:

пример схемы

Вот тот же пример в виде простого текста:

+-----------+  +-----------------+  +-----------------+  +-----------------+
| Model A   |  | Model B         |  | Model C         |  | Model D         |
+----+------+  +----+------------+  +----+------------+  +----+------------+
| PK | id   |  | PK | id         |  | PK | id         |  | PK | id         |
+----+------+  +----+------------+  +----+------------+  +----+------------+
|    | name |  |    | name       |  |    | name       |  |    | name       |
+----+------+  +----+------------+  +----+------------+  +----+------------+
|    |      |  | FK | model_A_id |  | FK | model_B_id |  | FK | model_C_id |
+----+------+  +----+------------+  +----+------------+  +----+------------+

Как видите, первая модель (Модель A) имеет отношение один ко многим, а вторая модель (Модель B) и так далее. Я уже создал миграцию и уже связал все свои модели следующим образом:

class ModelA extends Model {

    modelBs() {
        return this.hasMany('App/Models/ModelB')
    }
}

class ModelB extends Model {

    modelA() {
        return this.belongsTo('App/Models/ModelA')
    }

    modelCs() {
        return this.hasMany('App/Models/ModelC')
    }
}

// And so on with classes ModelC, and ModelD...

Как видно из приведенного выше кода, в соответствии с документацией AdonisJS, это необходимо сделать в первую очередь, чтобы создать связь во время заполнения. Затем я должен создать фабрики для каждой модели следующим образом:

// File: database/factory.js

// Model A blueprint
Factory.blueprint('App/Models/ModelA', (faker) => {
  return {
    name: faker.sentence()
  }
})

// Model B blueprint
Factory.blueprint('App/Models/ModelB', (faker) => {
  return {
    name: faker.sentence()
  }
})

// And so on with Models C and D...

Наконец, в моем файле сеялки, который называется ModelASeeder.js, я создаю отношения между всеми моделями, чтобы связать их:

//File: database/seeds/ModelASeeder.js

const Factory = use('Factory')

class ModelASeeder {
  async run () {

    // I create only one Model A.
    const modelA_var = await Factory
      .model('App/Models/ModelA')
      .create()

    // Then I makeMany of Model B (4 of them).
    const modelB_var = await Factory
      .model('App/Models/ModelB')
      .makeMany(4)

    // As the documentation says, I associate them like so:

    await modelA_var.modelBs().save(modelB_var)


    // Then I want to assign Model C with the ModelBs that I associated to ModelA before, like so (I create 8 of them):

    const modelC_var = await Factory
      .model('App/Models/ModelC')
      .makeMany(8)

    // Then I try to assign ModelB to ModelC

    await modelB_var.modelCs().save(modelC_var)

    // And so on with the model D, etc, etc....

Я столкнулся с проблемой, которую не могу понять. Когда я запускаю команду adonis seed, я получаю следующее сообщение об ошибке:

TypeError: relatedInstance.save is not a function
    at Proxy.save (/MyUser/User/my-app/node_modules/@adonisjs/lucid/src/Lucid/Relations/HasMany.js:165:28)

И, наконец, это только семена первого стола (таблицы модели А), но не всех остальных. Итак, у меня есть два вопроса:

Прежде всего, почему я получаю эту ошибку?

Во-вторых, является ли это лучшим подходом для достижения моей цели по заполнению моей базы данных таким образом?

Огромное спасибо за ваше время, чтобы ответить на мой вопрос, и извините за то, что я допустил ошибку в моем описании, мой английский не идеален.

0 ответов

Попробуйте использовать saveMany()вместо save().

Чтобы сохранить несколько экземпляров в отношениях hasMany или ownToMany, вам необходимо использоватьsaveMany().

Документация:https://adonisjs.com/docs/4.0/relationships

Другие вопросы по тегам