Как управлять каскадными семенами и фабриками в 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