如何只获取父母和孩子的姓名?



我有关系文章+评论。

这:

$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(我们知道(

因此,如果您想加载更少的数据,您可以:

  1. 切换到数组加载getArrayResult()而不是getResult()。这样,您可以自由选择正在加载的字段,但会丢失对象。你所做的一切,你都必须通过数组遍历来完成。例:

    echo $article['comments'][0]['title'];
    
  2. 或者,您可以选择加载PARTIAL对象。优点是保留对象访问权限,但缺点是需要稍微更改 SQL。例如:

    $queryBuilder->select('PARTIAL a.{name}', 'c')
    ->from(Article::class, 'a')
    ->leftJoin('a.comments', 'c');
    $data = $queryBuilder->getQuery()->getResult();
    

请注意,未加载的字段设置为NULL,因此可能会导致意外尝试取消引用 null。

希望这有帮助...

最新更新