Symfony2映射适用于一个实体,但不适用于另一个实体

时间:2015-07-23 11:55:43

标签: php mysql symfony doctrine-orm

我有两个地图一起映射。

Skin.php:

/**
 * @var CmsElement
 *
 * @ORM\ManyToOne(targetEntity="CmsElement")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="homepage_id", referencedColumnName="id")
 * })
 */
private $homepage;

CmsElement.php:

/**
 * @var Skin
 *
 * @ORM\ManyToOne(targetEntity="Skin")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="skin_id", referencedColumnName="id")
 * })
 */
private $skinId;

就是这样。 My Skin表格映射正确,我得到了CmsElement的id。但是在我的Cmselement中,我没有得到所需的skinId ......它总是保持为NULL。代码是相同的,为什么它不起作用?

更好理解的一个例子:

皮肤:

id: 1
homepage_id: 2

CmsElement:

id: 2
skin_id: NULL

1 个答案:

答案 0 :(得分:0)

为了设置ManyToOne关系,你必须以这两种方式指定它:

// Skin.php
/**
 * @var CmsElement
 *
 * @ORM\OneToMany(targetEntity="CmsElement", mappedBy="skinId")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="homepage_id", referencedColumnName="id")
 * })
 */
private $homepage;

// CmsElement.php :
/**
 * @var Skin
 *
 * @ORM\ManyToOne(targetEntity="Skin", inversedBy="homepage")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="skin_id", referencedColumnName="id")
 * })
 */
private $skinId;

但是,请注意以下几点:

  • 使用$ skin而不是$ skinId,因为您引用的是实体,而不仅仅是id属性
  • 关系ManyToOne是指具有多个实体的一方链接到具有一个实体的一方,因此请定义多边和单边。我假设CmsElement是多方面,所以我在CmsElement和OneToMany上使用了ManyToOne。但如果我错了,请反过来。
  • 在多方使用属性的多重名称。例如,如果您为多个$主页设置One $ skin,请确保使用最终的" S",它更容易理解。

在这里,您可以找到信息,以便以正确的方式建立您的关系:Sf2 Doc