【问题标题】:How to ORDER BY DateTime in Doctrine 2?如何在 Doctrine 2 中按日期时间排序?
【发布时间】:2014-04-10 19:17:29
【问题描述】:

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

        $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;

...
}

但是 order by 不起作用。 我的结果未按开始日期显示。

我正在寻找从最早到最新发生的 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 字段与 DB 中的内容类似: 2014-05-24 19:30:00

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

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

这是否意味着它真的是一个教义字符串,这就是它不按日期时间排序的原因?

谢谢

【问题讨论】:

  • precision=0, scale=0,当字段类型为 datetime 时是否需要它们?奇怪..删除这两个,因为它们是数字类型,然后尝试..如果我错了,请纠正我。
  • 你是对的,它只用于十进制:)
  • 我仍然无法让它工作:(对此有任何帮助
  • $qb->add('orderBy', 'p.created DESC');
  • 这是 exact 查询吗?如果是这样:您不需要 andX() 那里,因为您只有 1 个表达式。如果没有,向我们展示确切的查询。我们需要知道是否有诸如 JOIN 子句之类的东西,或者您是否正在使用 Doctrine Paginator 等...

标签: php sql symfony doctrine-orm dql


【解决方案1】:

数据库

你应该检查一下数据库中的表结构

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

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

CLI 工具

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

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

【讨论】:

  • 谢谢贾斯珀。这是我对该字段的注释。现在是日期时间。 /** * @var \DateTime * * @ORM\Column(name="date_start", type="datetime", nullable=true, unique=false) */ private $dateStart;
  • @Miles M。我不是在谈论映射元数据(注释),而是关于实际数据库。 (不是 Doctrine 执行查询,因此对结果进行排序,它只是生成查询。执行查询的是 数据库。)
【解决方案2】:

也许你可以像这样重写你的代码

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

    $qb->select( 'e' )
        ->from( 'Entity\Event',  'e' )
        ->setMaxResults( $limit )
        ->setFirstResult( $offset )
        ->orderBy('date(e.dateStart) ASC');//this is the trick that works for me

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

【讨论】:

  • 对我来说失败了:我收到了[Syntax Error] line 0, col 191: Error: Expected known function, got 'date'(Doctrine 2.8.x)。
【解决方案3】:

您的查询会是这样的:

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

您必须尊重查询生成器参数的顺序,我希望这会有所帮助。

【讨论】:

  • 何不知道有一个特定的顺序,我在哪里可以知道什么是正确的顺序?我已经多次阅读 D2 文档,但从未见过
  • 经过多次测试,这实际上不起作用。我已更新我的答案以粘贴我的实际查询。
  • docs.doctrine-project.org/en/2.0.x/reference/query-builder.html - 这篇文章对你很有用。见第 13.2.5 点。表达式
  • 您在谈论@TahaMetal 的哪些参数?这里不计算方法调用的顺序。
【解决方案4】:

你能给我结果吗:

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

die($qb->getQuery()->getSql());

一种可能的想法: 您的属性 $dateStart 的吸气剂是否声明得当?应该是:

public function getDateStart()
{
    return $this->dateStart;
}

【讨论】:

  • getter 与 DQL 无关。
  • 哪些吸气剂?这就是我回显 SQL 时发生的情况:SELECT e0_.id AS id0, e0_.name AS name1, e0_.description AS description2, e0_.link AS link3, e0_.social_media_link AS social_media_link4, e0_.booking_link AS booking_link5, e0_.price AS price6, e0_.currency AS currency7, e0_.picture AS picture8, e0_.date_created AS date_created9, e0_.date_start AS date_start10, e0_.date_end AS date_end11, e0_.popularity AS popularity12, e0_.confirmed AS confirmed13, e0_.user_id AS user_id14, e0_.admin_id AS admin_id15, e0_.place_id AS place_id16 FROM event e0_ ORDER BY e0_.date_start ASC LIMIT 200 OFFSET 0
  • 使用您建议的确切查询(更简单)
【解决方案5】:

查询参数的顺序很重要。在您的情况下,查询应该是:

    $events = $qb->select( 'e' )
        ->from( 'Entity\Event',  'e' )
        ->orderBy('e.dateStart', 'DESC')
        ->setFirstResult( $offset )
        ->setMaxResults( $limit )
        ->getQuery()
        ->getResult();

不完全确定您所说的“从最早到最近发生的 20 个第一事件”是什么意思,但如果您给您最新的一组事件,那应该是什么意思。要更改顺序,请将“DESC”更改为“ASC”。

【讨论】:

    猜你喜欢
    • 2021-11-23
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多