Skip to content

Commit 28c328a

Browse files
committed
feat: add QueryBuilder macros for custom query methods
- Add MacroRegistry class to manage macro registration and storage - Add QueryBuilder::macro() static method to register custom methods - Add QueryBuilder::hasMacro() static method to check macro existence - Implement __call() in QueryBuilder for dynamic macro execution - Add comprehensive tests for macro functionality - Add example demonstrating macro usage on all dialects - Add documentation for query macros feature - Update README.md with macro examples and links
1 parent a78eb0c commit 28c328a

File tree

8 files changed

+1267
-1
lines changed

8 files changed

+1267
-1
lines changed

README.md

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ Complete documentation is available in the [`documentation/`](documentation/) di
158158
- **[Core Concepts](documentation/02-core-concepts/)** - Connection management, query builder, parameter binding, dialects
159159
- **[Query Builder](documentation/03-query-builder/)** - SELECT, DML, filtering, joins, aggregations, subqueries
160160
- **[JSON Operations](documentation/04-json-operations/)** - Working with JSON across all databases
161-
- **[Advanced Features](documentation/05-advanced-features/)** - Transactions, batch processing, bulk operations, UPSERT, query scopes
161+
- **[Advanced Features](documentation/05-advanced-features/)** - Transactions, batch processing, bulk operations, UPSERT, query scopes, query macros
162162
- **[Error Handling](documentation/06-error-handling/)** - Exception hierarchy, enhanced error diagnostics with query context, retry logic, logging, monitoring
163163
- **[Helper Functions](documentation/07-helper-functions/)** - Complete reference for all helper functions
164164
- **[Best Practices](documentation/08-best-practices/)** - Security, performance, memory management, code organization
@@ -852,13 +852,47 @@ $db->addScope('active', function ($query) {
852852
$items = $db->find()->from('items')->get();
853853
```
854854

855+
**Query Builder Macros Example:**
856+
```php
857+
use tommyknocker\pdodb\query\QueryBuilder;
858+
859+
// Register custom macros
860+
QueryBuilder::macro('active', function (QueryBuilder $query) {
861+
return $query->where('status', 'active');
862+
});
863+
864+
QueryBuilder::macro('wherePrice', function (QueryBuilder $query, string $operator, float $price) {
865+
return $query->where('price', $price, $operator);
866+
});
867+
868+
QueryBuilder::macro('recent', function (QueryBuilder $query, int $days = 7) {
869+
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
870+
return $query->where('created_at', $date, '>=');
871+
});
872+
873+
// Use macros as methods
874+
$activeProducts = $db->find()
875+
->table('products')
876+
->active()
877+
->wherePrice('>', 100.00)
878+
->recent(30)
879+
->get();
880+
881+
// Check if macro exists
882+
if (QueryBuilder::hasMacro('active')) {
883+
// Macro is registered
884+
}
885+
```
886+
855887
See:
856888
- [Documentation: ActiveRecord](documentation/05-advanced-features/active-record.md)
857889
- [Documentation: ActiveRecord Relationships](documentation/05-advanced-features/active-record-relationships.md)
858890
- [Documentation: Query Scopes](documentation/05-advanced-features/query-scopes.md)
891+
- [Documentation: Query Builder Macros](documentation/05-advanced-features/query-macros.md)
859892
- [Example: ActiveRecord Usage](examples/23-active-record/01-active-record-examples.php)
860893
- [Example: ActiveRecord Relationships](examples/27-active-record-relationships/01-relationships.php)
861894
- [Example: Query Scopes](examples/28-query-scopes/01-scopes-examples.php)
895+
- [Example: Query Builder Macros](examples/29-macros/01-macro-examples.php)
862896

863897
---
864898

0 commit comments

Comments
 (0)