小编典典

如何在Doctrine 2中按日期时间排序?

sql

我正在寻找执行以下查询的方法:

        $qb = $this->getEntityManager()->createQueryBuilder();

        $qb->select( 'e' )
            ->from( 'Entity\Event',  'e' )
            ->setMaxResults( $limit )
            ->setFirstResult( $offset )
            ->orderBy('e.dateStart', 'ASC');

        $events = $qb->getQuery()->getResult();

在哪里

/**
 * User
 *
 * @ORM\Table(name="event")
 * @ORM\Entity(repositoryClass="Repositories\EventRepository")
 */
class Event
{
    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_start", type="datetime", precision=0, scale=0, nullable=true, unique=false)
     */
    private $dateStart;

...
}

但是按顺序排序是行不通的。我的结果不会在开始日期之前显示。

我正在寻找从最早到最近发生的20个最重要的事件

我怎样才能做到这一点 ?

谢谢

编辑:

按照上一个答案,我正在更新查询。不幸的是,我仍然无法正常工作。请帮忙

     $qb->select( 'e' )
        ->from( 'Entity\Event',  'e' )
        ->Where( 
            $qb->expr()->andX(
                $qb->expr()->between('e.dateStart', ':from', ':to')
            )
        )
        ->orderBy('e.dateStart', 'ASC')
        ->setFirstResult( $offset )
        ->setMaxResults( $limit );

谢谢

编辑2:似乎移动orderBy确实有所作为。到目前为止,我没有任何错误。该脚本可以与orderBy一起正常运行,但是它在日期时间之前根本没有订购!

在我的结果中,我看不到任何让我认为它已基于任何给定属性(绝对不是datetime)进行订购的东西!

那怎么可能呢?

日期时间字段在数据库中看起来像这样:2014-05-24 19:30:00

当我var Dump上一个查询产生的查询时,这里是datetie字段的内容:

 ["dateStart"]=> string(8) "DateTime"

这是否意味着它确实是一个学说的字符串,这就是为什么它没有按日期时间排序的原因?

谢谢


阅读 201

收藏
2021-05-23

共1个答案

小编典典

数据库

您应该检查 数据库中 的表结构:

什么类型的列date_start
应该是DATETIME(在MySQL中,其他供应商可能会有所不同)。
但我怀疑这是某种形式的字符串,如VARCHAR(或CHARTEXT等等)。

在这种情况下,结果 是有序的 ,但不是您期望的那样。这是因为数据库对不同类型的排序不同。

CLI工具

Doctrine附带了一个控制台工具,该工具能够验证您的映射并检查数据库是否与它们一致:doctrine orm:validate-schema

如果它报告与数据库不一致,则doctrine orm:schema-tool:update --dump- sql用于使其显示将更新数据库所执行的查询(它将假定映射是事实的来源)。

2021-05-23