定制 philiprehberger/laravel-db-expressions 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

philiprehberger/laravel-db-expressions

Composer 安装命令:

composer require philiprehberger/laravel-db-expressions

包简介

Database-agnostic SQL expression helper for date truncation, extraction, and differences across SQLite and MySQL

README 文档

README

Tests Latest Version on Packagist Last updated

Database-agnostic SQL expression helper for date truncation, extraction, and differences across SQLite and MySQL.

Requirements

  • PHP 8.2+
  • Laravel 11 or 12

Installation

composer require philiprehberger/laravel-db-expressions

The service provider and facade are registered automatically via Laravel's package discovery.

Usage

All methods are static and return plain SQL strings suitable for use in Eloquent's selectRaw, groupByRaw, orderByRaw, and whereRaw calls.

Date Truncation (for GROUP BY buckets)

Group records into time buckets using the dateTrunc* methods or the general-purpose dateFormat dispatcher.

use PhilipRehberger\DbExpressions\DatabaseExpressions;

// Hourly buckets: '2026-03-05 14:00:00'
$expr = DatabaseExpressions::dateTruncHour('created_at');

// Daily buckets: '2026-03-05'
$expr = DatabaseExpressions::dateTruncDay('created_at');

// Weekly buckets: '2026-09'
$expr = DatabaseExpressions::dateTruncWeek('created_at');

// Monthly buckets: '2026-03'
$expr = DatabaseExpressions::dateTruncMonth('created_at');

// Yearly buckets: '2026'
$expr = DatabaseExpressions::dateTruncYear('created_at');

// General dispatcher — throws `InvalidArgumentException` for unknown periods
$expr = DatabaseExpressions::dateFormat('created_at', 'week');

Real Eloquent query example:

use PhilipRehberger\DbExpressions\DatabaseExpressions;

$period = 'month'; // from request, e.g. hour|day|week|month|year

$results = Invoice::query()
    ->selectRaw(DatabaseExpressions::dateFormat('created_at', $period) . ' as period, SUM(total) as revenue')
    ->groupByRaw(DatabaseExpressions::dateFormat('created_at', $period))
    ->orderByRaw(DatabaseExpressions::dateFormat('created_at', $period))
    ->get();

Date Part Extraction (integer values)

Extract individual date components as integers.

use PhilipRehberger\DbExpressions\DatabaseExpressions;

// Hour of day: 0–23
$expr = DatabaseExpressions::extractHour('created_at');

// Day of month: 1–31
$expr = DatabaseExpressions::extractDay('created_at');

// Week number: 0–53
$expr = DatabaseExpressions::extractWeek('created_at');

// Month: 1–12
$expr = DatabaseExpressions::extractMonth('created_at');

// Year: e.g. 2026
$expr = DatabaseExpressions::extractYear('created_at');

// Quarter: 1–4
$expr = DatabaseExpressions::extractQuarter('created_at');

// Minute: 0–59
$expr = DatabaseExpressions::extractMinute('created_at');

// Second: 0–59
$expr = DatabaseExpressions::extractSecond('created_at');

Real Eloquent query example:

// Find which hour of the day has the most activity
$results = ApiUsageLog::query()
    ->selectRaw(DatabaseExpressions::extractHour('created_at') . ' as hour, COUNT(*) as hits')
    ->groupByRaw(DatabaseExpressions::extractHour('created_at'))
    ->orderByRaw(DatabaseExpressions::extractHour('created_at'))
    ->get();

Date Differences

Calculate the difference between two datetime columns.

use PhilipRehberger\DbExpressions\DatabaseExpressions;

// Difference in whole days (column1 - column2)
$expr = DatabaseExpressions::dateDiffDays('completed_at', 'created_at');

// Difference in hours (column1 - column2)
$expr = DatabaseExpressions::dateDiffHours('completed_at', 'created_at');

Real Eloquent query example:

// Average project duration in days
$avg = Project::query()
    ->whereNotNull('completed_at')
    ->selectRaw('AVG(' . DatabaseExpressions::dateDiffDays('completed_at', 'created_at') . ') as avg_days')
    ->value('avg_days');

Date Arithmetic

Add or subtract days from a datetime column.

use PhilipRehberger\DbExpressions\DatabaseExpressions;

// Add 7 days to a date
$expr = DatabaseExpressions::addDays('created_at', 7);

// Subtract 30 days from a date
$expr = DatabaseExpressions::subtractDays('created_at', 30);

Real Eloquent query example:

// Find records expiring within the next 7 days
$expiring = Subscription::query()
    ->whereRaw(DatabaseExpressions::addDays('created_at', 365) . ' < NOW()')
    ->get();

// Get records from the last 30 days using date arithmetic
$recent = Order::query()
    ->whereRaw('created_at >= ' . DatabaseExpressions::subtractDays('NOW()', 30))
    ->get();

Facade

You can also use the DbExpressions facade:

use PhilipRehberger\DbExpressions\Facades\DbExpressions;

$expr = DbExpressions::dateTruncMonth('created_at');
$expr = DbExpressions::extractQuarter('invoiced_at');
$expr = DbExpressions::dateDiffDays('due_at', 'created_at');

Driver Detection

use PhilipRehberger\DbExpressions\DatabaseExpressions;

$driver = DatabaseExpressions::driver();   // 'sqlite', 'mysql', etc.
$isSqlite = DatabaseExpressions::isSqlite(); // bool

Multi-Driver Support

Method SQLite MySQL / MariaDB
dateTruncHour strftime('%Y-%m-%d %H:00:00', col) DATE_FORMAT(col, '%Y-%m-%d %H:00:00')
dateTruncDay strftime('%Y-%m-%d', col) DATE_FORMAT(col, '%Y-%m-%d')
dateTruncWeek strftime('%Y-%W', col) DATE_FORMAT(col, '%Y-%u')
dateTruncMonth strftime('%Y-%m', col) DATE_FORMAT(col, '%Y-%m')
dateTruncYear strftime('%Y', col) DATE_FORMAT(col, '%Y')
extractHour CAST(strftime('%H', col) AS INTEGER) HOUR(col)
extractDay CAST(strftime('%d', col) AS INTEGER) DAY(col)
extractWeek CAST(strftime('%W', col) AS INTEGER) WEEK(col)
extractMonth CAST(strftime('%m', col) AS INTEGER) MONTH(col)
extractYear CAST(strftime('%Y', col) AS INTEGER) YEAR(col)
extractQuarter ((CAST(strftime('%m', col) AS INTEGER) - 1) / 3) + 1 QUARTER(col)
extractMinute CAST(strftime('%M', col) AS INTEGER) MINUTE(col)
extractSecond CAST(strftime('%S', col) AS INTEGER) SECOND(col)
addDays datetime(col, '+N days') DATE_ADD(col, INTERVAL N DAY)
subtractDays datetime(col, '-N days') DATE_SUB(col, INTERVAL N DAY)
dateDiffDays CAST((julianday(c1) - julianday(c2)) AS INTEGER) DATEDIFF(c1, c2)
dateDiffHours (julianday(c1) - julianday(c2)) * 24 TIMESTAMPDIFF(HOUR, c2, c1)

Security

All $column parameters are validated against the pattern [a-zA-Z0-9_.]+ before being interpolated into SQL. Passing an invalid column name (e.g. user-supplied input) throws an InvalidArgumentException. Never pass raw user input as a column name.

Known Limitations

Week Number Semantics

The dateTruncWeek() and extractWeek() methods produce slightly different week numbers between SQLite and MySQL:

Driver dateTruncWeek format extractWeek function Week start
SQLite strftime('%W') — Monday-based, 00–53 strftime('%W') — Monday-based, 00–53 Monday
MySQL DATE_FORMAT('%u') — Monday-based, 01–53 WEEK() — mode 0, Sunday-based, 0–53 Varies

If exact cross-driver parity is required for week numbers, consider using dateTruncDay() and computing week buckets in application code.

dateFormat() Throws on Invalid Periods

The dateFormat() dispatcher throws an InvalidArgumentException if the period is not one of: hour, day, week, month, year. Validate user input before passing it to this method.

API

Method Description
DatabaseExpressions::dateTruncHour(string $column): string SQL expression for hourly time bucket
DatabaseExpressions::dateTruncDay(string $column): string SQL expression for daily time bucket
DatabaseExpressions::dateTruncWeek(string $column): string SQL expression for weekly time bucket
DatabaseExpressions::dateTruncMonth(string $column): string SQL expression for monthly time bucket
DatabaseExpressions::dateTruncYear(string $column): string SQL expression for yearly time bucket
DatabaseExpressions::dateFormat(string $column, string $period): string General dispatcher for date truncation; throws on invalid period
DatabaseExpressions::extractHour(string $column): string Extract hour of day as integer (0–23)
DatabaseExpressions::extractDay(string $column): string Extract day of month as integer (1–31)
DatabaseExpressions::extractWeek(string $column): string Extract week number as integer (0–53)
DatabaseExpressions::extractMonth(string $column): string Extract month as integer (1–12)
DatabaseExpressions::extractYear(string $column): string Extract year as integer
DatabaseExpressions::extractQuarter(string $column): string Extract quarter as integer (1–4)
DatabaseExpressions::extractMinute(string $column): string Extract minute as integer (0–59)
DatabaseExpressions::extractSecond(string $column): string Extract second as integer (0–59)
DatabaseExpressions::addDays(string $column, int $days): string Add days to a datetime column
DatabaseExpressions::subtractDays(string $column, int $days): string Subtract days from a datetime column
DatabaseExpressions::dateDiffDays(string $col1, string $col2): string Difference between two date columns in whole days
DatabaseExpressions::dateDiffHours(string $col1, string $col2): string Difference between two date columns in hours
DatabaseExpressions::driver(): string Return the current DB driver name
DatabaseExpressions::isSqlite(): bool Whether the current connection is SQLite

Development

composer install
vendor/bin/phpunit
vendor/bin/pint --test
vendor/bin/phpstan analyse

Support

If you find this project useful:

Star the repo

🐛 Report issues

💡 Suggest features

❤️ Sponsor development

🌐 All Open Source Projects

💻 GitHub Profile

🔗 LinkedIn Profile

License

MIT

philiprehberger/laravel-db-expressions 适用场景与选型建议

philiprehberger/laravel-db-expressions 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 77 次下载、GitHub Stars 达 1, 最近一次更新时间为 2026 年 03 月 06 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「database」 「sql」 「sqlite」 「date」 「laravel」 「expressions」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 philiprehberger/laravel-db-expressions 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 philiprehberger/laravel-db-expressions 我们能提供哪些服务?
定制开发 / 二次开发

基于 philiprehberger/laravel-db-expressions 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 77
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 1
  • 点击次数: 31
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 1
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-03-06