为什么使用doctrine直接访问从数据库获取的数据不起作用,而使用getter却可以?

问题描述 投票:0回答:1

在具有学说的 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;
}

仍在努力隔离问题,一些提供的代码目前更像是伪代码。

谢谢

php symfony orm doctrine getter
1个回答
0
投票

这是使用代理对象的学说延迟加载机制的正常行为。

有人指出这里的文档不清楚:https://github.com/doctrine/common/issues/934,这导致这里的学说文档发生变化:https://github.com/学说/orm/拉/9311.

正如文档中现在所述,给定类 A,直接访问除 $this 之外的类 A 的任何实例的私有属性都是危险的。

© www.soinside.com 2019 - 2024. All rights reserved.