带有可空/可选连接的Doctrine查询

时间:2017-08-18 12:26:06

标签: php symfony doctrine-orm

我在我的存储库类中有一个方法让我Article加入他们(类别,图片......)而不是每个Article都有类别或图片,什么不给我支持所有预期的结果,导致我当前的存储库函数只返回ArticleCategories不为空的Image,并忽略具有空值的内容。

我的Article实体有以下关系。

 /**
 * @ORM\ManyToMany(targetEntity="App\ArticleBundle\Entity\Category", cascade={"persist"})
 */
private $categories;

/**
 * @ORM\ManyToOne(targetEntity="App\ArticleBundle\Entity\Image", cascade={"persist"})
 * 
 */
private $image;

这是我的存储库功能

public function getArticle($id)
{
    $qb = $this->createQueryBuilder('a')
    ->where('a.id = :theId')
        ->setParameter('theId', $id)
    ->join('a.author', 'auth')
        ->addSelect('auth')
    ->join('a.categories', 'cat')
        ->addSelect('cat')
    ->join('a.image', 'img')
        ->addSelect('img');

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

现在我想知道我是否可以在一个查询中使用Articlecategories获得image。我想说当使用Doctrine延迟加载时(通过避免查询中的连接)我得到了预期的结果。

1 个答案:

答案 0 :(得分:4)

使用->leftJoin()在一个查询中获取Articlecategories或不image的{​​{1}}:

public function getArticle($id)
{
    $qb = $this
        ->createQueryBuilder('a')
        ->addSelect('auth', 'cat', 'img')
        ->join('a.author', 'auth')
        ->leftJoin('a.categories', 'cat')
        ->leftJoin('a.image', 'img')
        ->where('a.id = :theId')
        ->setParameter('theId', $id)
    ;

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

因此,当Doctrine尝试以懒惰的方式加载相关属性时,避免额外的查询。

说明:

使用->join()->innerJoin()

enter image description here

  

这是最简单,最容易理解的加入,是最常见的。此查询将返回左表(表A)中右表(表B)中具有匹配记录的所有记录。

使用->leftJoin()

enter image description here

  

此查询将返回左表(表A)中的所有记录,无论这些记录中的任何记录是否与右表(表B)匹配。它还将返回右表中的任何匹配记录。

来源: Visual-Representation-of-SQL-Joins 详细解释 C.L. Moffatt