我有2个实体,用户和许可证,以及桥接实体UserLicense。 用户和许可之间的关联是ManytoMany。 我已经定义了ORM注释如下,但我有一个问题。当我在数据库中保存用户和许可证时,我没有将UserLicense引用的数据升级。
user.php的
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\OneToMany(targetEntity="UserLicense", mappedBy="user_id")
*/
private $id;
License.php
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\OneToMany(targetEntity="UserLicense", mappedBy="license_id")
*/
private $id;
UserLicense.php
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="id")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user_id;
/**
* @ORM\ManyToOne(targetEntity="License", inversedBy="id")
* @ORM\JoinColumn(name="license_id", referencedColumnName="id")
*/
private $license_id;
怎么了?
答案 0 :(得分:1)
请参阅注释,关系是ManyToMany,带有额外字段
你必须做实体之间的关系,并且学说要管理它们。 你说教条,我想要用户和userLicences之间的关系。 Doctrine用正确的字段管理连接列,大多数时候默认值都很好,这个注释可以删除: @ORM \ JoinColumn(name =“user_id”,referencedColumnName =“id”)
试试这个:
user.php的
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*
*/
private $id;
/*
*@ORM\OneToMany(targetEntity="UserLicense", mappedBy="user")
*/
private $userLicence;
License.php
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*
*/
private $id;
/*
* @ORM\OneToMany(targetEntity="UserLicense", mappedBy="license")
*/
private $userLicence;
UserLicense.php
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="userLicence")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
/**
* @ORM\ManyToOne(targetEntity="License", inversedBy="userLicence")
* @ORM\JoinColumn(name="license_id", referencedColumnName="id")
*/
private $license;
- 评论前的第一个答案---
如果我理解你想要做什么,你只需在用户和许可证之间建立关系。
Doctrine负责处理关系所需的数据库表。 你不必担心这个。
用户可以拥有许多许可证,许可证可以由许多用户拥有,您可以这样做:
user.php的
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*
*/
private $id;
/*
* @ORM\ManyToMany(targetEntity="License", mappedBy="user")
*/
private $licence;
Lincence.php
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/*
* @ORM\ManyToMany(targetEntity="User", ReversedBy="license")
*
*/
private $user;
私人$用户;
您必须添加$ license和$ user的setter和getter,当您向用户添加许可时,Doctrine将进行关联。
像
这样的东西$licence = new Licence();
$user->addLicence($licence);
之后,你需要flush();
这只是一些示例代码,如何实现它取决于您的工作。
一些好的资源: https://knpuniversity.com/screencast/symfony2-ep3/many-to-many-relationship 这个很容易理解很多关系
必读: http://doctrine-orm.readthedocs.io/en/latest/reference/association-mapping.html
如果你想在某些情况下拥有相关的实体,你必须看到学说能力fetch =“EAGER”,并阅读有关ArrayCollection的信息