我在我的存储库类中有一个方法让我Article
加入他们(类别,图片......)而不是每个Article
都有类别或图片,什么不给我支持所有预期的结果,导致我当前的存储库函数只返回Article
且Categories
不为空的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();
}
现在我想知道我是否可以在一个查询中使用Article
,categories
获得image
。我想说当使用Doctrine延迟加载时(通过避免查询中的连接)我得到了预期的结果。
答案 0 :(得分:4)
使用->leftJoin()
在一个查询中获取Article
,categories
或不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()
:
这是最简单,最容易理解的加入,是最常见的。此查询将返回左表(表A)中右表(表B)中具有匹配记录的所有记录。
使用->leftJoin()
:
此查询将返回左表(表A)中的所有记录,无论这些记录中的任何记录是否与右表(表B)匹配。它还将返回右表中的任何匹配记录。