使用 Doctrine ORM 查询当天的生日

Posted

技术标签:

【中文标题】使用 Doctrine ORM 查询当天的生日【英文标题】:Query birthdays of the day with Doctrine ORM 【发布时间】:2013-05-17 01:16:59 【问题描述】:

使用原始 SQL,我习惯性地执行以下操作:

SELECT * FROM users WHERE MONTH(birthday) = 11 AND DAY(birthday) = 17.

但是这些MONTH()DAY() 函数不适用于所有数据库=/

那么,在 Doctrine 支持的任何数据库中,最好的方法是什么?

【问题讨论】:

【参考方案1】:

要在 SQL 服务器级别进行此计算,您必须创建一些自定义 DQL 函数:

http://www.doctrine-project.org/blog/doctrine2-custom-dql-udfs.html

也看一下官方文档:

http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#adding-your-own-functions-to-the-dql-language

这是一个带有 postgresql DISTANCE 函数的示例:

https://github.com/KnpLabs/DoctrineBehaviors/blob/master/src/Knp/DoctrineBehaviors/ORM/Geocodable/Query/AST/Functions/DistanceFunction.php

您关心的是使这项工作适用于任何支持的 RDBM 吗? 在 getSql() 方法中利用 DatabasePlatform:

<?php

public function getSql(SqlWalker $walker)

    $walker->getConnection()->getDatabasePlatform(); // platform specific stuff

【讨论】:

感谢@Florian 的回复。我只是不明白为什么 Doctrine 没有标准的 DQL 函数,因为所有 RDBM 都支持这种类型的函数。我正在创建a ZF2 module 来抽象这个问题,并且我打算最终在 Doctrine 上提出拉取请求来实现这个 DQL 功能。你怎么看?

以上是关于使用 Doctrine ORM 查询当天的生日的主要内容,如果未能解决你的问题,请参考以下文章

使用 Doctrine ORM 的*** EXISTS 查询

Doctrine Orm 2 使用本机 SQL 的递归查询

Doctrine ORM,两个不同的查询产生相同的结果集

如何在 Doctrine ORM 查询中查找与别名相关的表?

在 Repository 中使用 Doctrine 2 ORM 和 OneToOne 获得“排名”

使用 Doctrine ORM ManyToOne 关系在相反方向获取实体