Php 在原则2中如何按日期时间订购?
我希望执行以下查询:Php 在原则2中如何按日期时间订购?,php,sql,symfony,doctrine-orm,dql,Php,Sql,Symfony,Doctrine Orm,Dql,我希望执行以下查询: $qb = $this->getEntityManager()->createQueryBuilder(); $qb->select( 'e' ) ->from( 'Entity\Event', 'e' ) ->setMaxResults( $limit ) ->setFirstResult( $offset )
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select( 'e' )
->from( 'Entity\Event', 'e' )
->setMaxResults( $limit )
->setFirstResult( $offset )
->orderBy('e.dateStart', 'ASC');
$events = $qb->getQuery()->getResult();
在哪里
但是“订购方式”不起作用。
我的结果不会按开始日期显示
我正在寻找从最早到最晚发生的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排序的
在我的结果中,我看不到任何东西会让我认为它是基于任何给定属性订购的,当然不是datetime
这怎么可能
Datetime字段与数据库中的类似:
2014-05-2419:30:00
当我转储来自上一个查询的查询时,这里是我对datetie字段的内容:
["dateStart"]=> string(8) "DateTime"
这是否意味着它实际上是一个理论的字符串,这就是为什么它不按日期时间排序
谢谢您的查询如下:
$qb->select( 'e' )
->from( 'Entity\Event', 'e' )
->orderBy('e.dateStart', 'ASC');
->setFirstResult( $offset )
->setMaxResults(20);
您必须尊重查询生成器参数的顺序,我希望这会有所帮助。您能告诉我以下结果吗:
$qb->select( 'e' )
->from( 'Entity\Event', 'e' )
->setMaxResults( $limit )
->setFirstResult( $offset )
->orderBy('e.dateStart', 'ASC');
die($qb->getQuery()->getSql());
一种可能的想法:
属性$dateStart的getter声明是否正确?应该是:
public function getDateStart()
{
return $this->dateStart;
}
$events = $qb->select( 'e' )
->from( 'Entity\Event', 'e' )
->orderBy('e.dateStart', 'DESC')
->setFirstResult( $offset )
->setMaxResults( $limit )
->getQuery()
->getResult();
数据库
您应该检查数据库中的表结构:
什么类型的列是date\u start
?它应该是
DATETIME
(在MySQL中,其他供应商可能会有所不同)。但我怀疑它是某种形式的字符串,比如
VARCHAR
(或者CHAR
,TEXT
,等等)
在这种情况下,结果是有序的,但不是按照您预期的方式。这是因为数据库对不同类型的排序不同
CLI工具
Doctrine附带了一个控制台工具,可以验证映射并检查数据库是否与映射一致:Doctrine orm:validate schema
如果它报告与数据库不一致,请使用
orm:schema工具:update--dump sql
让它显示更新数据库时将执行的查询(它将假定映射是真实性的来源)。也许您可以像这样重写代码
$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();
查询参数的顺序很重要。在您的情况下,查询应该是:
public function getDateStart()
{
return $this->dateStart;
}
$events = $qb->select( 'e' )
->from( 'Entity\Event', 'e' )
->orderBy('e.dateStart', 'DESC')
->setFirstResult( $offset )
->setMaxResults( $limit )
->getQuery()
->getResult();
不完全确定你所说的“从最早到最晚发生的20件第一件事”是什么意思,但你应该给出最新的一组事件。若要更改顺序,请将“DESC”更改为“ASC”。precision=0,scale=0,当字段类型为datetime时是否需要它们?奇怪。。删除这两个数字类型,然后重试。。如果我错了,请纠正我。你是对的,它只适用于十进制:)我仍然无法让它工作:(关于$qb->add('orderBy',p.created DESC')的任何帮助;这是准确的查询吗?如果是这样:你不需要
andX()
因为您只有一个表达式。如果没有,请向我们显示确切的查询。我们需要知道是否存在连接子句,或者您是否使用了原则分页器等。谁不知道有一个特定的顺序,我在哪里可以了解正确的顺序?我已经查看了D2文档很多次,但从未看到过这一点经过几次测试后,它实际上不起作用。我已经更新了我的答案,以粘贴我的实际查询。-本文对您很有用。请参阅第13.2.5点。您谈论的expr参数是@TahaMetal?方法调用的顺序在这里不算。getter与DQL无关。哪些getter?当我回显SQL时会发生这种情况:选择e0.id作为id0,e0.name作为name1,e0.description作为description2,e0.link作为link3,e0.social.media作为social.media作为link4,e0.booking.link作为booking.link5,e0.price作为price,e0.currency作为currency7,e0.picture作为picture8,e0.date作为创建日期,e0.date作为开始日期,e0作为开始日期,e0.date作为结束日期人口数量为12,e0.确认为已确认13,e0.用户id为用户id14,e0.管理员id为管理员id15,e0.地点id为地点id16,从事件e0.订单到e0.日期开始ASC限制200偏移量0谢谢Jasper。这是我对这个字段的注释。它是DATETIME。/***@var\DATETIME**@ORM\Column(name=“date\u start”,type=“DATETIME”,nullable=true,unique=false)*/private$dateStart;
@Miles M。我说的不是映射元数据(注释),而是实际的数据库。(不是条令执行查询,因此对结果排序,它只是生成查询。是数据库执行查询。)对我来说失败:我得到[语法错误]第0行,第191列:错误:预期已知函数,得到'date'
(条令2.8.x)。