oro / doctrine-extensions
MySQL 和 PostgreSQL 的 Doctrine 扩展。
Requires
- php: >=8.1
- doctrine/dbal: ~3.0|~4.0
- doctrine/lexer: ~3.0
- doctrine/orm: ~3.0
Requires (Dev)
- doctrine/annotations: ~2.0
- doctrine/data-fixtures: ^1.3
- phpunit/phpunit: ~10
- squizlabs/php_codesniffer: 3.9.*
- symfony/cache: 5.*
- symfony/yaml: 5.*
- dev-master
- 3.x-dev
- 3.0-alpha4
- 3.0-alpha3
- 3.0-alpha2
- 3.0-alpha1
- 2.x-dev
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.3.x-dev
- 1.3.2
- 1.3.1
- 1.3.0
- 1.2.x-dev
- 1.2.3
- 1.2.2
- 1.2.1
- 1.2.0
- 1.1.x-dev
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.x-dev
- 1.0.15
- 1.0.14
- 1.0.13
- 1.0.12
- 1.0.11
- 1.0.10
- 1.0.9
- 1.0.8
- 1.0.7
- 1.0.6
- 1.0.5
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.0
- dev-builds
This package is auto-updated.
Last update: 2024-08-31 11:50:08 UTC
README
目录
DQL 函数
此库提供了一组适用于 MySQL 和 PostgreSQL 的 Doctrine DQL 函数。
可用函数
DATE(expr)
- 从日期或日期时间表达式中提取日期部分。TIME(expr)
- 提取提供的表达式的时部分。TIMESTAMP(expr)
- 将表达式转换为 TIMESTAMP。TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2)
- 返回 datetime_expr2 – datetime_expr1,其中 datetime_expr1 和 datetime_expr2 是日期或日期时间表达式。参数unit
可以取以下值之一: MICROSECOND(微秒)、SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER 或 YEAR。CONVERT_TZ(expr, from_tz, to_tz)
- 将 datetime 值 expr 从由from_tz
给定的时区转换为由to_tz
给定的时区,并返回结果 datetime 值。DAY(expr)
- 返回月份中的天数(0-31)。DAYOFWEEK(expr)
- 返回日期表达式的星期索引(1 = 星期天,2 = 星期一,……,7 = 星期六)。这些索引值对应于 ODBC 标准。DAYOFMONTH(expr)
- 返回日期表达式的月份中的天数,在 1 到 31 的范围内,或者对于 '0000-00-00' 或 '2008-00-00' 等日期,其天部分为零时返回 0。DAYOFYEAR(expr)
- 返回年份中的天数(1-366)。HOUR(expr)
- 返回从参数中获取的小时。MD5(expr)
- 计算 MD5 校验和。MINUTE(expr)
- 返回从参数中获取的分钟。MONTH(expr)
- 返回传递的日期中的月份。QUARTER(expr)
- 返回传递的日期中的季度。SECOND(expr)
- 返回从参数中获取的秒。WEEK(expr)
- 返回年份中该天所在的周数。根据 ISO 8601,周从星期一开始,该年的第一周包含该年的 1 月 4 日。换句话说,该年的第一个星期四在该年的第一周。YEAR(expr)
- 返回传递的日期中的年份。POW(expr, power)
- 返回将参数提高到指定幂的结果。ROUND(value, ?precision)
- 将值四舍五入到指定的精度(如果没有指定,则默认为 0 精度)。CEIL(value)
- 返回向上取整的值。SIGN(expr)
- 返回参数的符号。CAST(expr as type)
- 任何类型的表达式,并产生一个指定类型的值。支持的类型包括:char
、string
、text
、date
、datetime
、time
、int
、integer
、bigint
、decimal
、boolean
、binary
、uuid
。CONCAT_WS
- 连接所有除了第一个参数之外的所有参数。第一个参数用作分隔字符串。GROUP_CONCAT
- 返回一个连接的字符串。GROUP_CONCAT 完整语法
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
REPLACE(subject, from, to)
- 在字符串subject
中将所有出现的字符串from
替换为to
。DATE_FORMAT(date, format)
- 根据格式字符串格式化日期值。格式字符串中可以使用以下指定符(在格式指定符字符之前需要使用%
字符)
安装
将以下依赖项添加到您的composer.json文件中
{ "require": { "oro/doctrine-extensions": "^3.0" } }
注册函数
Doctrine2
<?php $config = new \Doctrine\ORM\Configuration(); $config->addCustomStringFunction('group_concat', 'Oro\ORM\Query\AST\Functions\String\GroupConcat'); $config->addCustomNumericFunction('hour', 'Oro\ORM\Query\AST\Functions\SimpleFunction'); $config->addCustomDatetimeFunction('date', 'Oro\ORM\Query\AST\Functions\SimpleFunction'); $em = EntityManager::create($dbParams, $config);
Symfony
在 Symfony 中,您可以在 config.yml
中注册函数
doctrine: orm: dql: datetime_functions: date: Oro\ORM\Query\AST\Functions\SimpleFunction time: Oro\ORM\Query\AST\Functions\SimpleFunction timestamp: Oro\ORM\Query\AST\Functions\SimpleFunction convert_tz: Oro\ORM\Query\AST\Functions\DateTime\ConvertTz numeric_functions: timestampdiff: Oro\ORM\Query\AST\Functions\Numeric\TimestampDiff dayofyear: Oro\ORM\Query\AST\Functions\SimpleFunction dayofmonth: Oro\ORM\Query\AST\Functions\SimpleFunction dayofweek: Oro\ORM\Query\AST\Functions\SimpleFunction week: Oro\ORM\Query\AST\Functions\SimpleFunction day: Oro\ORM\Query\AST\Functions\SimpleFunction hour: Oro\ORM\Query\AST\Functions\SimpleFunction minute: Oro\ORM\Query\AST\Functions\SimpleFunction month: Oro\ORM\Query\AST\Functions\SimpleFunction quarter: Oro\ORM\Query\AST\Functions\SimpleFunction second: Oro\ORM\Query\AST\Functions\SimpleFunction year: Oro\ORM\Query\AST\Functions\SimpleFunction sign: Oro\ORM\Query\AST\Functions\Numeric\Sign pow: Oro\ORM\Query\AST\Functions\Numeric\Pow round: Oro\ORM\Query\AST\Functions\Numeric\Round ceil: Oro\ORM\Query\AST\Functions\SimpleFunction string_functions: md5: Oro\ORM\Query\AST\Functions\SimpleFunction group_concat: Oro\ORM\Query\AST\Functions\String\GroupConcat concat_ws: Oro\ORM\Query\AST\Functions\String\ConcatWs cast: Oro\ORM\Query\AST\Functions\Cast replace: Oro\ORM\Query\AST\Functions\String\Replace date_format: Oro\ORM\Query\AST\Functions\String\DateFormat
Laminas 项目
在 Laminas 项目(使用 DoctrineORMModule)中,您可以在 config/autoload/doctrine.global.php
中注册函数
return [ 'doctrine' => [ 'configuration' => [ 'orm_default' => [ 'datetime_functions' => [ 'date' => \Oro\ORM\Query\AST\Functions\SimpleFunction::class, 'time' => \Oro\ORM\Query\AST\Functions\SimpleFunction::class, 'timestamp' => \Oro\ORM\Query\AST\Functions\SimpleFunction::class, 'convert_tz' => \Oro\ORM\Query\AST\Functions\DateTime\ConvertTz::class, ], 'numeric_functions' => [ 'timestampdiff' => \Oro\ORM\Query\AST\Functions\Numeric\TimestampDiff::class, 'dayofyear' => \Oro\ORM\Query\AST\Functions\SimpleFunction::class, 'dayofmonth' => \Oro\ORM\Query\AST\Functions\SimpleFunction::class, 'dayofweek' => \Oro\ORM\Query\AST\Functions\SimpleFunction::class, 'week' => \Oro\ORM\Query\AST\Functions\SimpleFunction::class, 'day' => \Oro\ORM\Query\AST\Functions\SimpleFunction::class, 'hour' => \Oro\ORM\Query\AST\Functions\SimpleFunction::class, 'minute' => \Oro\ORM\Query\AST\Functions\SimpleFunction::class, 'month' => \Oro\ORM\Query\AST\Functions\SimpleFunction::class, 'quarter' => \Oro\ORM\Query\AST\Functions\SimpleFunction::class, 'second' => \Oro\ORM\Query\AST\Functions\SimpleFunction::class, 'year' => \Oro\ORM\Query\AST\Functions\SimpleFunction::class, 'sign' => \Oro\ORM\Query\AST\Functions\Numeric\Sign::class, 'pow' => \Oro\ORM\Query\AST\Functions\Numeric\Pow::class, 'round' => \Oro\ORM\Query\AST\Functions\Numeric\Round::class, 'ceil' => \Oro\ORM\Query\AST\Functions\SimpleFunction::class, ], 'string_functions' => [ 'md5' => \Oro\ORM\Query\AST\Functions\SimpleFunction::class, 'group_concat' => \Oro\ORM\Query\AST\Functions\String\GroupConcat::class, 'cast' => \Oro\ORM\Query\AST\Functions\Cast::class, 'concat_ws' => \Oro\ORM\Query\AST\Functions\String\ConcatWs::class, 'replace' => \Oro\ORM\Query\AST\Functions\String\Replace::class, 'date_format' => \Oro\ORM\Query\AST\Functions\String\DateFormat::class ] ] ] ] ];
贡献
架构
DQL 函数解析
大多数仅需要一个算术一级参数的函数可以使用 Oro\ORM\Query\AST\Functions\SimpleFunction
解析。此类负责解析函数定义并将解析后的数据保存到参数中。它扩展了 Oro\ORM\Query\AST\Functions\AbstractPlatformAwareFunctionNode
。
SQL 生成
SQL 生成由扩展 PlatformFunctionNode
的特定平台函数负责。AbstractPlatformAwareFunctionNode
根据当前连接中使用的数据库平台实例名称和 DQL 函数名称创建适当的平台函数实例。
平台函数类的命名规则
Oro\ORM\Query\AST\Platform\Functions\$platformName\$functionName
添加新的平台
要添加对新平台的支持,只需创建一个新的文件夹 Oro\ORM\Query\AST\Platform\Functions\$platformName
,并在其中添加所有必需函数的实现(使用上面指定的命名规则)。
添加新的函数
如果您的函数是只有一个算术一级参数的函数,则不需要自定义 DQL 函数解析器,可以使用 Oro\ORM\Query\AST\Functions\SimpleFunction
。然后只需要您的函数的特定平台 SQL 实现即可。
如果您实现的是更复杂的函数,如 GROUP_CONCAT,则需要 DQL 解析器和 SQL 实现。
如果您想向此库添加新函数,请随意进行分支并创建一个包含您实现情况的 pull request。请记住更新文档(此 README.md 文件)以包含您的新函数描述,并添加必要的测试(和/或测试固定值)。所有新函数必须为两个受支持的平台(MySQL 和 PostgreSQL)实现。
字段类型
此库还提供了以下字段类型
MoneyType
PercentType