1

我对 Symfony 和 Doctrine 很陌生,我找不到解决问题的方法。

我有一个名为的数据库表transactional和一个名为customer. 在transactional表中是表的外键customer。现在我想从两个表中获取所有数据。但是客户字段都设置为空。

这是transactionalphp 对象中的外键:

transactional

/**
 * @var \AppBundle\Entity\Customer
 *
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Customer")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="fk_customer", referencedColumnName="id")
 * })
 */
private $fkCustomer;

教义查询:

$em = $this->getDoctrine()->getManager();
$transactions = $em->getRepository('AppBundle:Transactional')->findAll();
dump($transactions);

结果:

0 => Transactional {#483 ▼
-id: 1
-date: DateTime @1510873200 {#493 ▶}
-fkCustomer: Customer {#566 ▼
  +__isInitialized__: false
  -id: 1
  -gender: null
  -firstname: null

非常感谢您的时间和帮助。=)

4

2 回答 2

3

那是学说延迟加载。

访问 Transactional 对象的客户属性后,将加载相关信息。

但是,如果您遍历许多事务条目,这并不理想,因为每个客户对象都将通过单个查询加载。

您可以通过将 fetchMode 设置为 like 来解决此问题EAGER

/**
 * @var \AppBundle\Entity\Customer
 *
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Customer", fetch="EAGER")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="fk_customer", referencedColumnName="id")
 * })
 */
private $fkCustomer;

它应该完全填充客户数据,而不是使用代理对象。

另一种方法是通过显式连接客户数据的自定义存储库方法加载交易项目。例如,通过创建自定义存储库Transactional并添加如下功能:

public function load()
{
    $qb = $this->_em->createQueryBuilder();
    $qb->select('t, c')
        ->from('AppBundle:Transactional','t')
        ->join('t.fkCustomer', 'c');

    return $qb->getQuery()->execute();
}

如何创建自定义存储库可以在文档中找到:https ://symfony.com/doc/3.3/doctrine/repository.html

于 2017-12-15T10:54:16.953 回答
1

您必须将获取类型设置为渴望:

Eager Type:也加载关联的实体。

惰性类型:根据需要加载关联实体。

/**
 * @var \AppBundle\Entity\Customer
 *
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Customer",fetch="EAGER")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="fk_customer", referencedColumnName="id")
 * })
 */
private $fkCustomer;
于 2017-12-15T10:57:12.143 回答