代码之家  ›  专栏  ›  技术社区  ›  Dario

符号/条令:选择多个表

  •  1
  • Dario  · 技术社区  · 8 年前

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

    我有一个名为 transactional 还有一个叫 customer . 在 交易的 表是 顾客 桌子现在我想从两个表中获取所有数据。但是客户字段都设置为null。

    这是中的外键 交易的 php对象:

    交易的 :

    /**
     * @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
    

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

    2 回复  |  直到 8 年前
        1
  •  3
  •   Joe    8 年前

    这就是懒散加载的学说。

    访问事务对象的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

        2
  •  1
  •   wanna know    8 年前

    您必须将fetch type设置为eager:

    渴望的类型: 同时加载关联实体。

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

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