我广泛使用了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
和急切加载结果?