在具有学说的 PHP Symfony 项目中,我使用以下具有自引用属性“credit”的类和引用类 foo 的另一个属性,如下所示。
/**
* Bill
*
* @ORM\Table(name="bill")
* @ORM\Entity(repositoryClass="BillRepository")
*/
class Bill {
/**
* @var Bill
* @ORM\ManyToOne(targetEntity="Bill")
* @ORM\JoinColumn(name="credit_id", nullable=true)
*/
private $credit;
public function getCredit() {return $this->credit;}
/**
* @var Foo
* @ORM\ManyToOne(targetEntity="Foo")
* @ORM\JoinColumn(name="foo_id", nullable=true)
*/
private $foo;
public function getFoo() { return $this->foo; }
public function getCreditFooDirectAccess() { return $this->getCredit()->foo; }
public function getCreditFooMethodAccess() { return $this->getCredit()->getFoo(); }
}
/**
* Foo
*
* @ORM\Table(name="foo")
* @ORM\Entity(repositoryClass="FooRepository")
*/
class Foo {
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
public function getId() { return $this->id; }
}
现在以下两个控制器显示不同的结果。直接访问显示 NULL,而方法访问则显示一些 ID。有什么想法吗?我想知道这是否与我获取数据的方式有关。
public function testDirectAccessAction(Request $request)
{
$dql = "SELECT bill FROM Bill bill";
$bill = $this->getEm()->createQuery($sql)->getFirstResult();
var_dump($bill->getCreditFooDirectAccess() ? $bill->getId() : null);
die;
}
public function testMethodAccessAction(Request $request)
{
$dql = "SELECT bill FROM Bill bill";
$bill = $this->getEm()->createQuery($sql)->getFirstResult();
var_dump($bill->getCreditFooMethodAccess() ? $bill->getId() : null);
die;
}
仍在努力隔离问题,一些提供的代码目前更像是伪代码。
谢谢
这是使用代理对象的学说延迟加载机制的正常行为。
有人指出这里的文档不清楚:https://github.com/doctrine/common/issues/934,这导致这里的学说文档发生变化:https://github.com/学说/orm/拉/9311.
正如文档中现在所述,给定类 A,直接访问除 $this 之外的类 A 的任何实例的私有属性都是危险的。