我想创建实体房间,其中包含两个用户之间的对话,并为此额外的唯一字段。我是这样实现的:
/**
* @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;User.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端做?
发布于 2017-11-02 05:33:23
我想你要找的是这个:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/composite-primary-keys.html
通过将@Id添加到这两个属性,看起来您已经完成了此操作。这将在数据库中创建一个复合主键。这将确保您的表对于每个相应字段的同一两个用户永远不会有多个条目。
这都是基于您拥有外键,或者至少在字段上设置了唯一索引。
您不会想尝试用PHP来处理这个问题,因为每次需要创建一个新值时,您都必须遍历表中的每个值,无论您使用哪个SQL数据库提供程序,它都应该能够更容易地处理。
https://stackoverflow.com/questions/45494826
复制相似问题