在我们的一种产品中,我们目前正在遇到有关多对一关系的一些问题。情况如下:
- 我们有一个"类似"的汇总,包含userId,一个" lieeType"实体和likeDentityId。
- Liepype实体由ID和字符串值组成,目前可以扩展。 ,可以扩展。
- LeakedentityID是指所喜欢的实体本身的ID(文章ID或媒体ID(
我们当前设置的问题是,当我们插入新喜欢时,每个类似的人都会获得与其他类型相同的字符串值,而我希望它们是相同的ID。
更多的视觉效果,这是当前表显示我们喜欢的表。它具有包含对类型的引用的类似_type_id。
带有喜欢的表
这是我们类型类型的表。如您所见,它生成了2种具有不同ID的不同Lifetypes,并将其链接到类似。
带有liketypes的表
我首选的情况是,每当我坚持一个新的类似的情况时,学说检查是否已经存在,如果是的,则将已经存在的LikeType ID链接到类似。因此只有1个"媒体" lieeType,并且两个都具有相同的含义。
。这是我的类似ORM实体的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="MyNamespaceLikeDomainEntityLike" table="likes" repository-class="MyNamespaceLikeInfrastructureRepositoryLikeRepository">
<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="MyNameSpaceLikeDomainEntityLikeType" 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="MyNameSpaceLikeDomainEntityLikeType" repository-class="MyNameSpaceLikeInfrastructureRepositoryLikeRepository">
<id name="id" type="string" length="191">
<generator strategy="AUTO" />
</id>
<field name="type" type="string" length="191" />
</entity>
</doctrine-mapping>
也许我们犯了一个简单的错误,但是我找不到解决这个问题的解决方案,尽管我们通过检查数据库中的现有liketype看到了一些解决方法,然后在持续存在之前插入ID,但我们感到应该是ORM为我们做这件事的任务。因此,我想知道是否有一些配置错误来实现这一目标。
预先感谢。
-Danny Eerens
使like_type.type
字段唯一,它将阻止重复值的插入:
<field name="type" type="string" length="191" unique="true" />
然后,当您要插入新的like
时,可以检查该类型是否已经存在:
// This is the name of the like_type --------------------------------------------------------------------v-----------v
if (($LikeType = $entityManager->getRepository('MyNameSpaceLikeDomainEntityLikeType')->findOneByName($likeTypeName)) == null)
{
// the Like type wasn't found, create a new one
$LikeType = new LikeType();
$LikeType->setType($likeTypeName);
$entityManager->persist($LikeType);
}
// Whatever if the like type is a new one or not, it can now be set to the like
$Like->SetLikeType($LikeType);
$entityManager->persist($Like);