我有文章+评论的关系。
此:
$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行,“ comments FROM”附近的第15列:错误:无效的PathExpression。必须是StateFieldPathExpression。
答案 0 :(得分:0)
如果您的关系设置正确,则可以通过调用以下命令来获得评论:
$article->getComments();
答案 1 :(得分:0)
在您的左联接中,您将注释别名为'p',但是您尝试在选择中使用'c'访问注释。如果您->leftJoin('a.comments', 'c')
,则应该可以选择“ c.title”。如果这不起作用,则可能需要检查您的实体中的学说关系是否正确建立。
答案 2 :(得分:0)
实际上,如果要保留面向对象的数据访问,则需要有一个根元素(在您的情况下为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
,这样可能会导致意外尝试取消引用空值。
希望这对您有帮助...