Symfony/Doctrine:选择多个表



我对Symfony和Doctrine的新手很新,我找不到解决我的问题的解决方案。

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

这是transactional PHP对象中的外键:

transactional

/**
 * @var AppBundleEntityCustomer
 *
 * @ORMManyToOne(targetEntity="AppBundleEntityCustomer")
 * @ORMJoinColumns({
 *   @ORMJoinColumn(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

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

是学说的懒惰加载。

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

这不是理想的选择,但是如果您在许多交易条目中迭代,因为每个客户对象都会通过单个查询加载。

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

/**
 * @var AppBundleEntityCustomer
 *
 * @ORMManyToOne(targetEntity="AppBundleEntityCustomer", fetch="EAGER")
 * @ORMJoinColumns({
 *   @ORMJoinColumn(name="fk_customer", referencedColumnName="id")
 * })
 */
private $fkCustomer;

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

另一种方法是通过自定义存储库方法加载交易项目,该方法明确加入客户数据。例如,通过为Transactional创建自定义存储库,并添加这样的Funciton:

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

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

急切类型:也加载关联的实体。

懒惰类型:加载相关的实体。

/**
 * @var AppBundleEntityCustomer
 *
 * @ORMManyToOne(targetEntity="AppBundleEntityCustomer",fetch="EAGER")
 * @ORMJoinColumns({
 *   @ORMJoinColumn(name="fk_customer", referencedColumnName="id")
 * })
 */
private $fkCustomer;

相关内容

  • 没有找到相关文章

最新更新