gpt4 book ai didi

php - Doctrine 防止连接表中自引用的组合

转载 作者:行者123 更新时间:2023-11-29 10:41:00 26 4
gpt4 key购买 nike

我想创建实体 Room,其中包含两个用户之间的对话,以及额外的唯一字段。我是这样实现的:

/**
* @ORM\Table(name="chat_rooms")
* @ORM\Entity(repositoryClass="Cunningsoft\ChatBundle\Repository\RoomRepository")
*/
class Room
{

/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="startedChatting")
* @ORM\JoinColumn(name="first_user", referencedColumnName="id")
*/
private $firstUser;

/**
* @ORM\Id
* @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="joinedChatting")
* @ORM\JoinColumn(name="second_user", referencedColumnName="id")
*/
private $secondUser;

用户.orm.xml:

<one-to-many target-entity="Cunningsoft\ChatBundle\Entity\Room" mapped-by="firstUser" field="startedChatting">
<cascade>
<cascade-persist/>
</cascade>
</one-to-many>
<one-to-many target-entity="Cunningsoft\ChatBundle\Entity\Room" mapped-by="secondUser" field="joinedChatting">
<cascade>
<cascade-persist/>
</cascade>
</one-to-many>

它工作正常,但在 Room 端创建实例时,我可以创建以下记录:

+------------+-------------+
| first_user | second_user |
+------------+-------------+
| 3 | 4 |
| 4 | 3 |
+------------+-------------+

问题是如何防止语义相同的数据重复,哪种方法是正确的,在数据​​库还是在 PHP 端执行此操作?

最佳答案

我认为您正在寻找的是: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html

看起来您已经通过将 @Id 添加到这两个属性来完成此操作。这将在数​​据库中创建一个复合主键。这将确保您的表的每个相应字段对于相同的两个用户永远不会有多个条目。

这一切都取决于您拥有外键,或者至少在字段上设置了唯一索引。

您不想尝试使用 PHP 来处理此问题,因为每次需要创建新值时,您都必须迭代表中的每个值,无论您使用哪个 SQL 数据库提供程序都应该能够处理起来容易多了。

关于php - Doctrine 防止连接表中自引用的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45494826/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com