В одном из наших продуктов мы в настоящее время испытываем некоторые проблемы, связанные с отношением «многие к одному».Ситуация выглядит следующим образом:
- У нас есть агрегат "Like", содержащий идентификатор пользователя, сущность LikeType и идентификатор LikedEntityID.
- Субъект LikeType состоит из идентификатораи строковое значение, то есть «article» или «media» на данный момент, но могут быть расширены позже.
- LikedEntityId ссылается на идентификатор понравившейся сущности (так же как и идентификатор статьи).или идентификатор медиа)
Проблема с нашей текущей настройкой состоит в том, что когда мы вставляем новые лайки, каждый лайк получает новый liketype с тем же строковым значением, что и другие, тогда как я хочу, чтобы они былитот же идентификатор
Более наглядно, это текущая таблица, показывающая наши лайки.У него есть like_type_id, содержащий ссылку на тип like.
Таблица лайков
Это таблица, которую мы имеем для похожих типов.Как вы можете видеть, он генерирует 2 разных liketypes с разными идентификаторами и связывает их с подобными.
Таблица с liketypes
Моя предпочтительная ситуация такова, что всякий раз, когда яДля сохранения нового лайка Doctrine проверяет, существует ли liketype, и если да, то связывает уже существующий идентификатор liketype с аналогичным.Таким образом, есть только один «медиа» liketype, и оба лайка имеют одинаковый like_type_id.
Вот XML-конфигурация моего Like ORM Entity:
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
https://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="MyNamespace\Like\Domain\Entity\Like" table="likes" repository-class="MyNamespace\Like\Infrastructure\Repository\LikeRepository">
<id name="id" type="integer" column="id" length="191">
<generator strategy="AUTO" />
</id>
<field name="userId" type="string" length="191" />
<many-to-one field="likeType" target-entity="MyNameSpace\Like\Domain\Entity\LikeType" fetch="EAGER">
<cascade>
<cascade-persist/>
<cascade-merge/>
</cascade>
</many-to-one>
<field name="likedObjectId" type="string" length="191" />
</entity>
</doctrine-mapping>
И это xmlКонфигурация подобного типа:
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
https://www.doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="MyNameSpace\Like\Domain\Entity\LikeType" repository-class="MyNameSpace\Like\Infrastructure\Repository\LikeRepository">
<id name="id" type="string" length="191">
<generator strategy="AUTO" />
</id>
<field name="type" type="string" length="191" />
</entity>
</doctrine-mapping>
Возможно, мы совершаем простую ошибку, но я не смог найти решение этой проблемы, и хотя мы нашли некоторые обходные пути, проверив базу данных на наличие существующего типа,и затем вставляя идентификатор перед сохранением, мы считаем, что задачей ORM должно быть сделать это для нас.Итак, мне интересно, есть ли какие-то ошибки конфигурации, которые мы делаем, чтобы достичь этого.
Заранее спасибо.
-Дэнни Эренс