即使FK为空,Symfony,主义按外键排序

时间:2018-07-15 21:32:08

标签: symfony doctrine-orm

假设我有一个这样的实体

<?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,如何检索和排序所有实体呢?

1 个答案:

答案 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(); 
    }
}