2014-03-27 39 views
5

我使用Symfony 2.4.2我有两个学说实体。实体名称:城市和城镇。Symfony2学说在查询中急切加载

关系结构:

城市 - >镇=一对多 镇 - >市=多对一

实体/ City.php

/** 
* @ORM\OneToMany(targetEntity="Town", mappedBy="city") 
*/ 
private $towns; 

实体/ Town.php

/** 
* @ORM\ManyToOne(targetEntity="City", inversedBy="towns") 
* @ORM\JoinColumn(name="city_id", referencedColumnName="id") 
*/ 
private $city; 

Where In Query不在第二项和第三项中运行。

1-)镇=>市查询(工作)探查SS:http://prntscr.com/34lx9q

$query = $this->_entityManager->createQuery('SELECT town FROM PersonalSiteBundle:Town town'); 
$query->setFetchMode(
    'Personal\SiteBundle\Entity\Town', 
    "city", 
    \Doctrine\ORM\Mapping\ClassMetadata::FETCH_EAGER 
); 
$query->execute(); 

2-)镇=>市查询(不工作)探查SS:http://prntscr.com/34ly4h

$query = $this->_entityManager->createQuery('SELECT town FROM PersonalSiteBundle:Town town'); 
$query->setFetchMode(
    'Personal\SiteBundle\Entity\Town', 
    "city", 
    \Doctrine\ORM\Mapping\ClassMetadata::FETCH_EAGER 
); 
$query->execute(array(),Query::HYDRATE_ARRAY); 

3 - )城市=>城镇查询(不工作)Profiler SS:http://prntscr.com/34ly4h

$query = $this->_entityManager->createQuery('SELECT city FROM PersonalSiteBundle:City city'); 
$query->setFetchMode(
    'Personal\SiteBundle\Entity\City', 
    "towns", 
    \Doctrine\ORM\Mapping\ClassMetadata::FETCH_EAGER 
); 
$query->execute(array(),Query::HYDRATE_ARRAY); 
+0

是究竟什么问题了吗?另外,为什么不使用'fetch'模式的注释?:'@ORM \ OneToMany(targetEntity =“Town”,mappedBy =“city”fetch =“EAGER”)' –

+0

当我使用注释时,总是渴望加载器正在使用。我想打电话查询。 –

回答

3

如果你想要在存储库中执行此操作,可以执行JOIN并将资源添加到所选对象。

这是QueryBuilder的版本:

$qb = $this->createQueryBuilder('city') 
    ->addSelect('town') 
    ->innerJoin('town.city', 'city'); 
$cities = $qb->getQuery()->getResult(); 
+0

这是迄今为止最好的答案! –