我对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;