Symfony/Doctrine: Select 多个表
Symfony/Doctrine: Select multiple tables
我是 Symfony 和 Doctrine 的新手,我找不到解决问题的方法。
我有一个名为 transactional
的数据库 table 和一个名为 customer
的数据库。 transactional
中的table是customer
中的外键table。现在我想从两个 table 中获取所有数据。但是客户字段都设置为空。
这里是 transactional
php 对象中的外键:
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
非常感谢您的宝贵时间和帮助。 =)
也就是懒加载主义。
一旦您访问您的交易对象的客户 属性,相关信息将被加载。
但是,如果您遍历许多事务条目,这并不理想,因为每个客户对象都将通过单个查询加载。
您可以通过将 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
您必须将获取类型设置为 eager:
Eager 类型: 同时加载关联的实体。
惰性类型:根据需要加载关联的实体。
/**
* @var \AppBundle\Entity\Customer
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Customer",fetch="EAGER")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="fk_customer", referencedColumnName="id")
* })
*/
private $fkCustomer;
我是 Symfony 和 Doctrine 的新手,我找不到解决问题的方法。
我有一个名为 transactional
的数据库 table 和一个名为 customer
的数据库。 transactional
中的table是customer
中的外键table。现在我想从两个 table 中获取所有数据。但是客户字段都设置为空。
这里是 transactional
php 对象中的外键:
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
非常感谢您的宝贵时间和帮助。 =)
也就是懒加载主义。
一旦您访问您的交易对象的客户 属性,相关信息将被加载。
但是,如果您遍历许多事务条目,这并不理想,因为每个客户对象都将通过单个查询加载。
您可以通过将 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
您必须将获取类型设置为 eager:
Eager 类型: 同时加载关联的实体。
惰性类型:根据需要加载关联的实体。
/**
* @var \AppBundle\Entity\Customer
*
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Customer",fetch="EAGER")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="fk_customer", referencedColumnName="id")
* })
*/
private $fkCustomer;