Symfony / Doctrine:选择多个表

时间:2017-12-15 10:43:52

标签: php symfony doctrine-orm symfony-3.4

我是Symfony和Doctrine的新手,我无法找到解决问题的方法。

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

这是transactional php对象中的外键:

transactional

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

The Doctrine Query:

$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

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

2 个答案:

答案 0 :(得分:1)

这是学说懒惰加载。

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

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

您可以通过将fetchMode设置为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

答案 1 :(得分:1)

您必须将抓取类型设置为急切:

渴望类型:也加载相关实体。

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

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