Php 符号/条令:选择多个表

Php 符号/条令:选择多个表,php,symfony,doctrine-orm,symfony-3.4,Php,Symfony,Doctrine Orm,Symfony 3.4,我对Symfony和Doctrine很陌生,我找不到解决问题的办法 我有一个名为transactional的数据库表和一个名为customer的数据库表。在事务表中,是客户表的外键。现在我想从两个表中获取所有数据。但是客户字段都设置为空 以下是事务性php对象中的外键: 事务性: 条令问题: $em = $this->getDoctrine()->getManager(); $transactions = $em->getRepository('AppBundle:Transa

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

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

以下是事务性php对象中的外键:

事务性:

条令问题:

$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

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

这就是懒惰加载的学说

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

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

您可以通过将fetchMode设置为以下方式来解决此问题:

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

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

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

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

如何创建自定义存储库可以在文档中找到:

这是一种延迟加载

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

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

您可以通过将fetchMode设置为以下方式来解决此问题:

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

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

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

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

如何创建自定义存储库可以在文档中找到:

您必须将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;

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

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

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

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

谢谢你,到目前为止我试过第一种选择,但没有成功。但是我现在读到了第二个。嘿,我还没有尝试第二个解决方案,但我发现了一些东西。在Symfony调试工具中,我找到了这个查询:从事务t0中选择t0.id作为id_1,选择t0.date作为日期_2,选择t0.fk_客户作为fk_客户_3。不应该有join语句吗?或者join语句是通过条令处理的?如果使用默认存储库函数(如findAll条令)仅查询此类的表,则不会。当获取渴望的作品时,它应该加入它们是的,但我也有渴望者几乎什么都不做的情况。在这些情况下,我总是使用自定义存储库,因为我可以定义应该使用的查询,并且通过手动连接实际上实现了一个db查询,而不是manyThank you。到目前为止,我尝试了第一个选项,但没有成功。但是我现在读到了第二个。嘿,我还没有尝试第二个解决方案,但我发现了一些东西。在Symfony调试工具中,我找到了这个查询:从事务t0中选择t0.id作为id_1,选择t0.date作为日期_2,选择t0.fk_客户作为fk_客户_3。不应该有join语句吗?或者join语句是通过条令处理的?如果使用默认存储库函数(如findAll条令)仅查询此类的表,则不会。当获取渴望的作品时,它应该加入它们是的,但我也有渴望者几乎什么都不做的情况。在这些情况下,我总是使用自定义存储库,因为我可以定义应该使用的查询,并通过手动连接实际实现单个db查询,而不是多个db查询