Symfony 5 / Doctrine:按创建日期时间对实体集合进行排序

Symfony 5 / Doctrine: Sorting entity collection by creation DateTime

我正在使用 Symfony 5 开发一个项目。我的一个用例涉及从数据库中读取一个集合,其中的项目按创建顺序降序排列(最新的在前)。我正在使用“stof/doctrine-extensions-bundle”的“Timestampable”扩展来保存我实体中的 createdAt 和 updatedAt 时间戳。

根据 Doctrine 文档,我可以使用 Repository 方法对项目进行排序:

$sortedEntities = $repository->findBy(array('createdAt' => 'DESC'));

这是有问题的属性:

    /**
     * @var \DateTime $createdAt
     *
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(type="datetime")
     */
    private $createdAt;

但是,使用 'ASC' 或 'DESC' 似乎对列表的排序没有影响。

您没有正确阅读 the documentation。 orderBy 是 second 参数,而不是第一个。 文档中给出的例子是

$tenUsers = $em->getRepository('MyProject\Domain\User')->findBy(array('age' => 20), array('name' => 'ASC'), 10, 0);

这里可以看到orderBy(name, ASC)是第二个arg。第一个 arg 是 where arg - 在这种情况下,WHERE age = 20.

这是来自 Doctrine\Persistence\ObjectRepository

full signature
/**
 * Finds objects by a set of criteria.
 *
 * Optionally sorting and limiting details can be passed. An implementation may throw
 * an UnexpectedValueException if certain values of the sorting or limiting details are
 * not supported.
 *
 * @param array<string, mixed> $criteria
 * @param string[]|null        $orderBy
 * @param int|null             $limit
 * @param int|null             $offset
 * @psalm-param array<string, 'asc'|'desc'|'ASC'|'DESC'> $orderBy
 *
 * @return object[] The objects.
 * @psalm-return T[]
 *
 * @throws UnexpectedValueException
 */
public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null);

我希望这能为您澄清。 :-)

[编辑] 针对您的评论,您不能使用 true 作为第一个参数的值。看我发的签名。第一个参数是 @param array<string, mixed>,所以它需要一个数组。那就试试这个:

sortedEntities = $repository->findBy(array(), array('createdAt' => 'DESC'));