教条注释,桥实体似乎不起作用

时间:2016-09-12 08:22:04

标签: database symfony orm doctrine

我有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;

怎么了?

1 个答案:

答案 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的信息