Доктрина не может сопоставить ассоциацию - PullRequest
0 голосов
/ 17 января 2019

Сценарий таков: пользователь однозначно связан с братом, а брат может заблокировать другого брата

Тогда я не могу сопоставить BrotherHasBrotherBlocked # brother в качестве идентификатора, поскольку целевая сущность Brother также сопоставляет ассоциацию как идентификатор, но у каждого объекта должен быть идентификатор, и я не знаю, как избавиться от этого сбоя сопоставления.

Отображенные объекты ниже:

Пользователь сущности:

App\Domain\Model\User\User:
    type: entity
    table: user
    id:
        id:
            type: integer
            nullable: false
            options:
                unsigned: true
            id: true
            generator:
                trategy: IDENTITY
    fields:
        ...
    oneToOne:
        brother:
            targetEntity: App\Domain\Model\User\Brother\Brother
            cascade: ["persist"]
            fetch: LAZY
            mappedBy: user
            joinColumns:
                user_id:
                    referencedColumnName: id
            orphanRemoval: false

Сущность Брат

App\Domain\Model\User\Brother\Brother:
    type: entity
    table: brother
    id:
        user:
            associationKey: true
    fields:
        ...
    oneToOne:
        user:
            targetEntity: App\Domain\Model\User\User
            cascade: ["persist"]
            fetch: LAZY
            inversedBy: brother
            joinColumns:
                id:
                    referencedColumnName: id
            orphanRemoval: false
    oneToMany:
        brothersBlocked:
            targetEntity: App\Domain\Model\User\Brother\BrotherHasBrotherBlocked
            mappedBy: brother
            cascade: ["persist"]               

Сущность BrotherHasBrotherBlocked

App\Domain\Model\User\Brother\BrotherHasBrotherBlocked:
    type: entity
    table: brother_has_brother_blocked
    id:
        brother:
            associationKey: true
        brotherBlocked:
            associationKey: true
    fields:
        ...
    manyToOne:
        brother:
            targetEntity:  App\Domain\Model\User\Brother\Brother
            cascade: ["persist"]
            inversedBy: brothersBlocked
            joinColumns:
                brother_id:
                    referencedColumnName: id
            orphanRemoval: false
        brotherBlocked:
            targetEntity:  App\Domain\Model\User\Brother\Brother
            cascade: ["persist"]
            inversedBy: brothersBlocked
            joinColumns:
                brother_blocked_id:
                    referencedColumnName: id
            orphanRemoval: false
    lifecycleCallbacks: {  }

Выполнение: bin / console доктрина: схема: проверить

Отображение

[FAIL] Сущность-класс App \ Domain \ Model \ User \ Brother \ BrotherHasBrotherБлокированное сопоставление недействительным: * Невозможно сопоставить ассоциацию 'App \ Domain \ Model \ User \ Brother \ BrotherHasBrotherBlocked # brother as идентификатор, потому что целевой объект Приложение \ Домен \ Модель \ Пользователь \ Брат \ Брат также отображает ассоциацию как идентификатор. * Невозможно сопоставить ассоциацию 'App \ Domain \ Model \ User \ Brother \ BrotherHasBrotherBlocked # brotherBlocked в качестве идентификатора, потому что целевой объект Приложение \ Домен \ Модель \ Пользователь \ Брат \ Брат также отображает ассоциацию как идентификатор. * Приложение сопоставлений \ Домен \ Модель \ Пользователь \ Brother \ BrotherHasBrotherBlocked # brotherBlocked и App \ Domain \ Model \ User \ Brother \ Brother # brothersBlocked являются несовместимы друг с другом.

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

1 Ответ

0 голосов
/ 18 января 2019

Проблема в том, что брат использует mappedBy: brother но и брат и брат заблокировали использование inversedBy: brothersBlocked

Вы можете удалить inversedBy: brothersBlocked из brotherBlocked без каких-либо ошибок.

Или вы можете добавить свойство blockedBy к вашему Brother объекту с помощью mappedBy brothersBlocked и для brothersBlocked добавить inversedBy: blockedBy

Итак, у вас будет: Сущность Брат

App\Domain\Model\User\Brother\Brother:
    type: entity
    table: brother
    id:
        user:
            associationKey: true
    fields:
        ...
    oneToOne:
        user:
            targetEntity: App\Domain\Model\User\User
            cascade: ["persist"]
            fetch: LAZY
            inversedBy: brother
            joinColumns:
                id:
                    referencedColumnName: id
            orphanRemoval: false
    oneToMany:
        brothersBlocked:
            targetEntity: App\Domain\Model\User\Brother\BrotherHasBrotherBlocked
            mappedBy: brotherBlocked
            cascade: ["persist"] 
        blockedBy:
            targetEntity: App\Domain\Model\User\Brother\BrotherHasBrotherBlocked
            mappedBy: brother
            cascade: ["persist"]

Сущность BrotherHasBrotherBlocked

App\Domain\Model\User\Brother\BrotherHasBrotherBlocked:
    type: entity
    table: brother_has_brother_blocked
    id:
        brother:
            associationKey: true
        brotherBlocked:
            associationKey: true
    fields:
        ...
    manyToOne:
        brother:
            targetEntity:  App\Domain\Model\User\Brother\Brother
            cascade: ["persist"]
            inversedBy: brothersBlocked
            joinColumns:
                brother_id:
                    referencedColumnName: id
            orphanRemoval: false
        brotherBlocked:
            targetEntity:  App\Domain\Model\User\Brother\Brother
            cascade: ["persist"]
            inversedBy: blockedBy
            joinColumns:
                brother_blocked_id:
                    referencedColumnName: id
            orphanRemoval: false
    lifecycleCallbacks: {  }
...