我有关系文章+评论。
这:
$queryBuilder = $em->createQueryBuilder();
$queryBuilder->select('a, c')
->from(Article::class, 'a')
->leftJoin('a.comments', 'p');
$articles = $queryBuilder->getQuery()->getResult();
工作正常,但我想要更少的数据,所以我正在尝试:
$queryBuilder = $em->createQueryBuilder();
$queryBuilder->select('a.name, c')
->from(Article::class, 'a')
->leftJoin('a.comments', 'p');
$articles = $queryBuilder->getQuery()->getResult();
我有错误:
[语义错误] 第 0 行,"SELECT a.name"附近的 col -1:错误:如果不选择至少一个根实体别名,则无法通过标识变量选择实体。
如果我使用:
$queryBuilder->select('a.name, c.title')
然后我有来自文章第一条评论的关键"标题"的类别。
如果我使用:
$queryBuilder->select('a.name, a.comments')
那么我有错误:
[语义错误] 第 0 行,第 15 行靠近"注释来自":错误:路径表达式无效。必须是 StateFieldPathExpression。
如果你的关系设置得当,你可以通过调用以下命令来获取你的评论:
$article->getComments();
在左侧联接中,您将注释别名为"p",但您正在尝试访问所选内容中带有"c"的注释。如果您->leftJoin('a.comments', 'c')
,那么您应该能够在您的选择中访问"c.title"。如果这不起作用,您可能需要检查您的教义关系是否在您的主题中正确设置。
事实上,如果你想保留面向对象的数据访问,你需要有一个根元素(在你的例子中Article
(,用于遍历到结构中的其他对象。在您的情况下,这很简单 - 您只有一个Comment
(我们知道(
因此,如果您想加载更少的数据,您可以:
-
切换到数组加载
getArrayResult()
而不是getResult()
。这样,您可以自由选择正在加载的字段,但会丢失对象。你所做的一切,你都必须通过数组遍历来完成。例:echo $article['comments'][0]['title'];
-
或者,您可以选择加载
PARTIAL
对象。优点是保留对象访问权限,但缺点是需要稍微更改 SQL。例如:$queryBuilder->select('PARTIAL a.{name}', 'c') ->from(Article::class, 'a') ->leftJoin('a.comments', 'c'); $data = $queryBuilder->getQuery()->getResult();
请注意,未加载的字段设置为NULL
,因此可能会导致意外尝试取消引用 null。
希望这有帮助...