如何仅获得父母和子女的名字?

时间:2018-06-23 13:39:22

标签: php symfony doctrine

我有文章+评论的关系。

此:

$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。

3 个答案:

答案 0 :(得分:0)

如果您的关系设置正确,则可以通过调用以下命令来获得评论:

$article->getComments();

答案 1 :(得分:0)

在您的左联接中,您将注释别名为'p',但是您尝试在选择中使用'c'访问注释。如果您->leftJoin('a.comments', 'c'),则应该可以选择“ c.title”。如果这不起作用,则可能需要检查您的实体中的学说关系是否正确建立。

答案 2 :(得分:0)

实际上,如果要保留面向对象的数据访问,则需要有一个根元素(在您的情况下为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,这样可能会导致意外尝试取消引用空值。

希望这对您有帮助...