Doctrine / Symfony联接表:意外行为

时间:2011-10-20 09:48:02

标签: join symfony doctrine doctrine-orm

我试图通过根据文章Joining to Related Records从几个表中加入几个记录来提高效率。在我的模型中,我有一个Tracker,它有一个Linkset,而后者又有多个链接。现在,在我的控制器中,我想通过以下方式遍历这些链接:

foreach ($tracker->getLinkset()->getLinks() as $link) etc..

此外,我的Tracker存储库中的代码如下:

public function findWithLinks(Tracker $tracker)
{
      $query = $this->createQueryBuilder('t')
                    ->select('t, ls, l')
                    ->innerJoin('t.linkset', 'ls')
                    ->leftJoin('ls.links', 'l')
                    ->where('t.id = :trackerId')
                    ->setParameters(array(
                          'trackerId' => $tracker->getId()
                    ));

      return $query->getQuery()->getResult();
}

我期望的是,在控制器中,当我遍历foreach表时,Symfony不会对数据库进行任何额外的调用,因为我有一个带有连接链接集和连接链接的Tracker。但是,运行另外两个查询以分别获取Linkset和Links。以下是相关实体的映射:

Linkset实体:

/**
  * @var Link
  *
  * @ORM\ManyToMany(targetEntity="Link", mappedBy="linkset")
  */
  private $links;

链接实体

/**
  * @var Linkset
  *
  * @ORM\ManyToMany(targetEntity="Linkset", inversedBy="link")
  * @ORM\JoinTable(name="linkcombo",
  *   joinColumns={
  *     @ORM\JoinColumn(name="link_id", referencedColumnName="id", onDelete="CASCADE")
  *   },
  *   inverseJoinColumns={
  *     @ORM\JoinColumn(name="linkset_id", referencedColumnName="id", onDelete="CASCADE")
  *   }
  * )
  */
  private $linkset;

1 个答案:

答案 0 :(得分:0)

也许你应该将你的“foreach”陈述改为这样的话?

foreach( $tracker->getLinkset() as $linkset ) {
    foreach( $linkset->getLinks() as $link ) {
        ....
    }
}

我希望它有所帮助!

修改

如果“linkset”和“link”之间的关系只是一个很多关系,我会将注释更改为:

链接集实体

/**
 * @ORM\ManyToMany(targetEntity="Link")
 **/
private $links;

链接实体

/**
 * @ORM\ManyToMany(targetEntity="Linkset")
 */

这应该假设:

  • Link和Linkset实体共享相同的命名空间,否则您应该将targetEntity =“XXX”更改为完全限定(即:Your \ Bundle \ Entities \ Linkset和Your \ OtherBundle \ Entities \ Link
  • Tracker和Linkset之间的关系没问题(你检查了吗?)

我确信更有经验的symfony2可能对你有所帮助,我最近开始使用symfony