假设我有一个这样的实体
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
*
* @ORM\Table(name="entity")
* @ORM\Entity(repositoryClass="AppBundle\Repository\ MyEntityRepository")
*/
class Entity
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(name="title", type="string", length=255)
*/
private $title;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Kind")
*/
private $kind;
}
我想查询它们并按种类排序。 这是我在存储库中所做的
<?php
namespace AppBundle\Repository;
class MyEntityRepository extends \Doctrine\ORM\EntityRepository
{
public function getAllOrdered()
{
return $this->createQueryBuilder('e')
->join('e.kind', 'k')
->orderBy('k.id', 'ASC')
->getQuery()
->getResult();
}
}
这很好用,但是完全忽略了种类为null的所有行。
那么,即使种类为null,如何检索和排序所有实体呢?
答案 0 :(得分:1)
您正在使用内部联接。这是一种效率更高的查询,因为它只检索两个表之间匹配的记录。
如果要选择空值,则需要使用leftJoin
。应谨慎使用,因为这些查询比innerJoin
重,因为考虑了基表中的所有记录,而不仅仅是匹配项。
<?php
namespace AppBundle\Repository;
class MyEntityRepository extends \Doctrine\ORM\EntityRepository
{
public function getAllOrdered()
{
return $this->createQueryBuilder('e')
->leftJoin('e.kind', 'k')
->orderBy('k.id', 'ASC')
->getQuery()
->getResult();
}
}