Doctrine2连接列

时间:2015-07-22 09:51:23

标签: php symfony doctrine-orm

我在doctrine2中定义了跟随实体(使用symfony)。

/**
 * 
 * @ORM\Table(name="order")
 * @ORM\Entity
 */
class Order

 /**
 * @var integer
 *
 * @ORM\Column(name="personid", type="integer", nullable=false)
 */
private $personid;

 /**
 * @ORM\OneToOne(targetEntity="People")
 * @ORM\JoinColumn(name="personid", referencedColumnName="personid")
 */
private $person;


public function getPersonId()
{
    return $this->personid;
}
public function getPerson()
{
    return $this->person;
}

}

我意识到,如果我调用$ order-> getPersonId(),它总是返回一个空值,我必须调用getPerson() - > getId()方法来获取正确的personid。 任何人都可以解释为什么变量$ personid没有填充? 如果我定义了一个,我应该删除用于连接的列ID吗?

由于

Gisella

2 个答案:

答案 0 :(得分:2)

您应该删除private $personid;,最好只在ORM中使用对象。

如果您使用$order->getPerson()->getId()获取ID,则不会出现问题,因为Doctrine不会加载完整的实体。只有在您调用除连接键之外的其他字段时,才会加载People实体。

你仍然可以使用这样的getter快捷方式:

public function getPersonId()
{
    return $this->getPerson()->getId();
}

编辑: 如果您使用Doctrine引用,您仍然可以使用“ID”,如下所示:

$order->setPerson($em->getReference('YourBundle:People', $personId));

通过这种方式,Doctrine将不会执行SELECT查询来加载此人的数据。

答案 1 :(得分:0)

当您已拥有$ person字段时,您不需要拥有$ personid字段。 $ people包含People对象(所有People的属性包括id)。

此外,当doctrine将您的对象转换为sql表时,他知道他必须加入id,因此它将创建一个名为personid的字段(在数据库中)。 (它是您在ORM中定义的名称)

  /**
 * @ORM\OneToOne(targetEntity="People")
 * @ORM\JoinColumn(name="personid", referencedColumnName="personid")
 */
private $person;

抱歉英语不好:p