Doctrine2:类似于Eloquent ORM的渴望加载关系......可以做到吗?

时间:2014-08-16 12:19:36

标签: php doctrine-orm

我广泛使用了Eloquent ORM。在大多数情况下,它完成了工作,但现在我正在使用Doctrine2的项目,虽然它做了一些非常好的事情,但对于其他事情,我正在撞墙而且没有任何谷歌搜索量我满意。

使用Eloquent,可以像这样处理急切的加载关系:

$articles = (new Article)->with('comments')->take(5)->get();
// SELECT * FROM articles LIMIT 5
// SELECT * FROM comments WHERE comments.articleId IN (1, 2, 3, 4, 5)

两组查询结果匹配在一起,我得到了我正在寻找的结果。

替代方法是更加懒惰地加载结果:

$articles = (new Article)->take(5)->get();
$articles->load('comments');
// Effectively this performs the same query execution

现在在Doctrine2中,我正在努力为此寻找类似物。我觉得我错过了一些秘密的神奇咒语来获得相同的结果。

我最接近的是使用LEFT JOIN执行查询。这大部分适用于但是,因为这是一对多关系,查询返回的多个comment行将导致LIMIT返回截断文章和评论的结果。

$builder = $em->createQueryBuilder()
    ->from('Article', 'article')
    ->leftJoin('article.comments', 'comments')
    ->select('article', 'comments');

// This is perfect... returns all the results expected
$results = $builder->getQuery()->getResult();
// This is less than perfect, it would return a broken result due to the LEFT JOIN in the query
$results = $builder->getQuery()->setMaxResults(5)->getResult();

现在这就是我被困住的地方。

我想我的问题是:

  • 如何应用LIMIT 急切加载结果?
  • 或者,我怎样懒洋洋地执行急切的关联?

0 个答案:

没有答案