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'));
我正在使用 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
/**
* 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'));