2

我在这里尝试做一件非常简单的事情,但似乎我还无法获得 DQL。此外,当我在其中输入“DQL”时,谷歌决定通过返回“SQL”的结果来让我的一天变得艰难。

我有一个具有各种属性的 Article 实体。其中之一是关联的图像实体:

/**
 * @ORM\ManyToOne(targetEntity="Image", inversedBy="articles")
 */
protected $image;

现在,为了防止延迟加载和它产生的不必要的加载,我想这样做得到Article.title 和 Article.image,仅此而已!只是文章的名称及其相关图像(整个图像实体)。

我怎么做?我尝试了我想出的所有方法,希望某些东西确实有效,并且我能够检查为什么有效而其他东西无效,但我就是无法让它发挥作用。

这是我想出的最理智的查询版本,前提是它可以工作:

public function getTitleBackground($id)
{
    $qb = $this->createQueryBuilder('a')
               ->select('a.title, a.id', 'i')
               ->leftJoin('a.image', 'i')
               ->where('a.id = :id')
               ->setParameter('id', $id);

    return $qb->getQuery()->getResult();
}

这返回了我这个错误:

渲染模板期间引发异常(“[Semantical Error] line 0, col -1 near 'SELECT a.title,': Error: Cannot select entity through identify variables without selection at least one root entity alias.” ) 在第 13 行的 PIFlexBlogBu​​ndle:Admin/Page:commentEdit.html.twig

当我添加a我的“修复”时->select(),它会为我选择所有文章字段,这正是我试图逃避的。

注意:我在 symfony2 存储库类中使用它。

4

2 回答 2

1

感谢 AdrienBrault 的回答,我设法进行了查询。

public function getTitleBackground()
{
    // Pure DQL
    $q = $this->getEntityManager()->createQuery('SELECT partial a.{id,title} FROM PIFlexBlogBundle:Article a JOIN a.image i');

    // OOP building DQL through queryBuilder
    $qb = $this->createQueryBuilder('a')
               ->select('partial a.{id, title}')
               ->join('a.image', 'i');

    return $qb->getQuery()->getResult();
}

通过查询生成器生成的原始 DQL 和 DQL 都给出相同的结果。

请注意,这将返回所有文章,要通过id获取,只需向它们添加 WHERE 子句。

于 2013-01-11T12:45:14.500 回答
1

您想使用 DQL 部分对象语法:http ://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#partial-object-syntax

于 2013-01-11T11:39:14.440 回答