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

Mil*_* M. 6 php sql dql symfony doctrine-orm

我想执行以下查询:

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

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

        $events = $qb->getQuery()->getResult();
Run Code Online (Sandbox Code Playgroud)

哪里

/**
 * 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;

...
}
Run Code Online (Sandbox Code Playgroud)

但订单不起作用.我的结果不会按日期开始显示.

我正在寻找从最快到最晚发生的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 );
Run Code Online (Sandbox Code Playgroud)

谢谢

编辑2:似乎移动秩序确实有所作为.我现在没有任何错误.使用orderBy脚本运行正常但是它根本没有按日期时间排序!

在我的结果中,我看不到任何会让我觉得它已根据任何给定的属性订购,最终不是日期时间!

怎么可能?

Datetime字段看起来像DB中的那样:2014-05-24 19:30:00

当我转储从前一个查询出来的查询时,这里是我对datetie字段的看法:

 ["dateStart"]=> string(8) "DateTime"
Run Code Online (Sandbox Code Playgroud)

这是否意味着它真的是一个学说的字符串,这就是为什么它不按日期时间排序?

谢谢

Jas*_*wer 11

数据库

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

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

在这种情况下,结果是有序的,但不是按照您期望的方式.这是因为数据库对不同类型的排序方式不同.

CLI工具

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

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


小智 6

您的查询将如下:

    $qb->select( 'e' )
        ->from( 'Entity\Event',  'e' )
        ->orderBy('e.dateStart', 'ASC');
        ->setFirstResult( $offset )
        ->setMaxResults(20);
Run Code Online (Sandbox Code Playgroud)

你必须尊重查询构建器参数的顺序,我希望这将有所帮助.