我在doctrine2中定义了以下实体(使用symfony)。
/**
*
* @ORMTable(name="order")
* @ORMEntity
*/
class Order
/**
* @var integer
*
* @ORMColumn(name="personid", type="integer", nullable=false)
*/
private $personid;
/**
* @ORMOneToOne(targetEntity="People")
* @ORMJoinColumn(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
你应该删除private $personid;
,最好只处理ORM中的对象。
这不是一个问题,如果你得到ID与$order->getPerson()->getId()
,因为学说不会加载完整的实体。People
实体只有在调用连接键以外的其他字段时才会被加载。
你仍然可以有这样的getter快捷方式:
public function getPersonId()
{
return $this->getPerson()->getId();
}
编辑:如果你使用Doctrine引用,你也可以使用"ID",像这样:
$order->setPerson($em->getReference('YourBundle:People', $personId));
通过这种方式,Doctrine将不会执行SELECT
查询来加载该人的数据。
如果已经有了$person字段,就不需要再添加$personid字段了。$people包含people对象(包含所有people的属性,包括id)。
此外,当doctrine将您的对象转换为sql表时,他知道他必须与id连接,这样它将在数据库中创建一个名为personid的字段。(这是您在ORM中定义的名称)
/**
* @ORMOneToOne(targetEntity="People")
* @ORMJoinColumn(name="personid", referencedColumnName="personid")
*/
private $person;
p