Адонис `принадлежит ToMany` отношение не работает - PullRequest
0 голосов
/ 21 октября 2019

У меня есть следующие модели:

ServiceCategory:

'use strict'

const Model = use('Model')

class ServiceCategory extends Model {
  services() {
    return this
      .belongsToMany('App/Models/Service')
      .withTimestamps()
  }
}

module.exports = ServiceCategory
'use strict'

/** @type {import('@adonisjs/lucid/src/Schema')} */
const Schema = use('Schema')

class ServiceCategorySchema extends Schema {
  up () {
    this.create('service_categories', (table) => {
      table.increments()

      table.string('name')
      table.string('slug').index()
      table.text('description').nullable()
      table.string('icon').nullable()

      table.boolean('is_activated').default(false).notNullable().default(true)

      table.timestamps()

      table.timestamp('deleted_at').nullable()
    })
  }

  down () {
    this.drop('service_categories')
  }
}

module.exports = ServiceCategorySchema

Сервис:

'use strict'

const Model = use('Model')

class Service extends Model {
  categories() {
    return this
      .belongsToMany('App/Models/ServiceCategory')
      .withTimestamps()
  }
}

module.exports = Service
'use strict'

/** @type {import('@adonisjs/lucid/src/Schema')} */
const Schema = use('Schema')

class ServiceSchema extends Schema {
  up () {
    this.create('services', (table) => {
      table.increments()

      table.string('name')
      table.string('slug').index()
      table.text('description').nullable()
      table.string('icon').nullable()

      table.float('price', 10, 2)

      table.boolean('is_negotiable').default(true)

      table.boolean('is_activated').default(false).notNullable().default(true)

      table.timestamps()

      table.timestamp('deleted_at').nullable()
    })
  }

  down () {
    this.drop('services')
  }
}

module.exports = ServiceSchema

Проблема в том, что когда я пытаюсьполучить все ServiceCategories с их Services Я просто получаю ServiceCategories с пустым массивом сервисов:

const serviceCategories = await ServiceCategory
      .query()
      .with('services')
      .fetch()
[
    {
      "id": 1,
      "name": "Beleza",
      "slug": "beleza",
      "description": null,
      "icon": null,
      "isActivated": true,
      "createdAt": "2019-10-21T10:43:32.000Z",
      "updatedAt": "2019-10-21T10:43:32.000Z",
      "services": []
    }
]

Intermediateтаблица:

'use strict'

/** @type {import('@adonisjs/lucid/src/Schema')} */
const Schema = use('Schema')

class ServiceServiceCategorySchema extends Schema {
  up () {
    this.create('service_service_category', (table) => {
      table.increments()

      table.integer('service_id').unsigned().index()
      table
        .foreign('service_id')
        .references('id')
        .inTable('services')
        .onDelete('cascade')

      table.integer('service_category_id').unsigned().index()
      table
        .foreign('service_category_id')
        .references('id')
        .inTable('service_categories')
        .onDelete('cascade')

      table.timestamps()
    })
  }

  down () {
    this.drop('service_service_category')
  }
}

module.exports = ServiceServiceCategorySchema

Но я могу прикрепить service к service_category:

const service = await Service.create(params)

await service.categories().attach([serviceCategoryId])

Это успешно связывает service с service category всводная таблица.

Теперь, почему я могу добавить отношение, но не могу его загрузить?

1 Ответ

1 голос
/ 21 октября 2019
'use strict'

const Model = use('Model')

class ServiceCategory extends Model {
  services() {
    return this
      .belongsToMany('App/Models/Service')
      .pivotTable("service_service_category")
      .withTimestamps()
  }
}

module.exports = ServiceCategory

после добавления сводная таблица имя, попробуйте это, если работает

...