Skip to content

Commit e766124

Browse files
authored
Merge pull request #65 from skipperbent/v4-feature-union
Development
2 parents 107120f + 388c916 commit e766124

File tree

9 files changed

+937
-578
lines changed

9 files changed

+937
-578
lines changed

README.md

Lines changed: 82 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,11 @@ $query->get();
115115
After the code below, every time a select query occurs on `users` table, it will add this where criteria, so banned users don't get access.
116116

117117
```PHP
118-
$queryBuilder->registerEvent('before-select', 'users', function(QueryBuilderHandler $qb)
118+
$queryBuilder->registerEvent('before-select', 'users', function(EventArguments $arguments)
119119
{
120-
$qb->where('status', '!=', 'banned');
120+
$arguments
121+
->getQueryBuilder()
122+
->where('status', '!=', 'banned');
121123
});
122124
```
123125

@@ -161,6 +163,7 @@ composer install pecee/pixie
161163
- [Limit and Offset](#limit-and-offset)
162164
- [Join](#join)
163165
- [Multiple Join Criteria](#multiple-join-criteria)
166+
- [Unions](#unions)
164167
- [Raw Query](#raw-query)
165168
- [Raw Expressions](#raw-expressions)
166169
- [**Insert**](#insert)
@@ -568,6 +571,62 @@ $queryBuilder
568571
->join('another_table', 'another_table.person_id', '=', 'my_table.id', 'FULL OUTER')
569572
```
570573

574+
### Unions
575+
576+
You can easily create unions by calling the `union` method on the `QueryBuilderHandler`.
577+
578+
Example:
579+
580+
```php
581+
$firstQuery =
582+
$queryBuilder
583+
->table('people')
584+
->whereNull('email');
585+
586+
$secondQuery =
587+
$queryBuilder
588+
->table('people')
589+
->where('hair_color', '=', 'green')
590+
->union($firstQuery);
591+
592+
$thirdQuery =
593+
$queryBuilder
594+
->table('people')
595+
->where('gender', '=', 'male')
596+
->union($secondQuery);
597+
598+
$items = $thirdQuery->get();
599+
```
600+
601+
The example above will create a sql-statement similar to this:
602+
603+
```sql
604+
(
605+
SELECT *
606+
FROM
607+
`cb_people`
608+
WHERE
609+
`gender` = 'male'
610+
)
611+
UNION
612+
(
613+
SELECT *
614+
FROM
615+
`cb_people`
616+
WHERE
617+
`email`
618+
IS NULL
619+
)
620+
UNION
621+
(
622+
SELECT *
623+
FROM
624+
`cb_people`
625+
WHERE
626+
`hair_color` = 'green'
627+
)
628+
```
629+
571630
#### Multiple Join Criteria
572631

573632
If you need more than one criterion to join a table then pass a closure as second parameter.
@@ -935,10 +994,18 @@ Pixie comes with powerful query events to supercharge your application. These ev
935994

936995
#### Registering Events
937996

997+
You can easily register a new event either by using the `registerEvent` method on either the `QueryBuilderHandler`, `Connection` or `EventHandler` class.
998+
999+
The event needs a custom callback function with a `EventArguments` object as parameters.
1000+
1001+
**Examples:**
1002+
9381003
```php
939-
$queryBuilder->registerEvent(EventHandler::EVENT_BEFORE_SELECT, 'users', function(QueryObject $qo, QueryBuilderHandler $qb)
1004+
$queryBuilder->registerEvent(EventHandler::EVENT_BEFORE_SELECT, 'users', function(EventArguments $arguments)
9401005
{
941-
$qb->where('status', '!=', 'banned');
1006+
$arguments
1007+
->getQueryBuilder()
1008+
->where('status', '!=', 'banned');
9421009
});
9431010
```
9441011
Now every time a select query occurs on `users` table, it will add this where criteria, so banned users don't get access.
@@ -952,9 +1019,10 @@ If you want the event to be performed when **any table is being queried**, provi
9521019
After inserting data into `my_table`, details will be inserted into another table
9531020

9541021
```php
955-
$queryBuilder->registerEvent(EventHandler::EVENT_AFTER_INSERT, 'my_table', function(QueryObject $qo, QueryBuilderHandler $qb, $insertId)
1022+
$queryBuilder->registerEvent(EventHandler::EVENT_AFTER_INSERT, 'my_table', function(EventArguments $arguments)
9561023
{
957-
$qb
1024+
$arguments
1025+
->getQueryBuilder()
9581026
->table('person_details')->insert(array(
9591027
'person_id' => $insertId,
9601028
'details' => 'Meh',
@@ -966,9 +1034,10 @@ $queryBuilder->registerEvent(EventHandler::EVENT_AFTER_INSERT, 'my_table', funct
9661034
Whenever data is inserted into `person_details` table, set the timestamp field `created_at`, so we don't have to specify it everywhere:
9671035

9681036
```php
969-
$queryBuilder->registerEvent(EventHandler::EVENT_AFTER_INSERT, 'person_details', function(QueryObject $qo, QueryBuilderHandler $qb, $insertId)
1037+
$queryBuilder->registerEvent(EventHandler::EVENT_AFTER_INSERT, 'person_details', function(EventArguments $arguments)
9701038
{
971-
$qb
1039+
$arguments
1040+
->getQueryBuilder()
9721041
->table('person_details')
9731042
->where('id', $insertId)
9741043
->update([
@@ -980,10 +1049,12 @@ $queryBuilder->registerEvent(EventHandler::EVENT_AFTER_INSERT, 'person_details',
9801049
After deleting from `my_table` delete the relations:
9811050

9821051
```php
983-
$queryBuilder->registerEvent(EventHandler::EVENT_AFTER_DELETE, 'my_table', function(QueryObject $qo, QueryBuilderHandler $qb)
1052+
$queryBuilder->registerEvent(EventHandler::EVENT_AFTER_DELETE, 'my_table', function(EventArguments $arguments)
9841053
{
985-
$bindings = $queryObject->getBindings();
986-
$qb
1054+
$bindings = $arguments->getQuery()->getBindings();
1055+
1056+
$arguments
1057+
->getQueryBuilder()
9871058
->table('person_details')
9881059
->where('person_id', $binding[0])
9891060
->delete();

src/Pecee/Pixie/Connection.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Pecee\Pixie;
44

55
use Pecee\Pixie\ConnectionAdapters\IConnectionAdapter;
6+
use Pecee\Pixie\Event\EventHandler;
67
use Pecee\Pixie\QueryBuilder\QueryBuilderHandler;
78
use Pecee\Pixie\QueryBuilder\QueryObject;
89

@@ -193,4 +194,18 @@ public function getLastQuery()
193194
return $this->lastQuery;
194195
}
195196

197+
/**
198+
* Register new event
199+
*
200+
* @param string $name
201+
* @param string|null $table
202+
* @param \Closure $action
203+
*
204+
* @return void
205+
*/
206+
public function registerEvent($name, $table = null, \Closure $action)
207+
{
208+
$this->getEventHandler()->registerEvent($name, $table, $action);
209+
}
210+
196211
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
<?php
2+
3+
namespace Pecee\Pixie\Event;
4+
5+
use Pecee\Pixie\QueryBuilder\QueryBuilderHandler;
6+
use Pecee\Pixie\QueryBuilder\QueryObject;
7+
8+
class EventArguments
9+
{
10+
/**
11+
* Event name
12+
* @var string
13+
*/
14+
private $name;
15+
16+
/**
17+
* @var QueryObject
18+
*/
19+
private $queryObject;
20+
21+
/**
22+
* @var QueryBuilderHandler
23+
*/
24+
private $queryBuilder;
25+
26+
/**
27+
* @var array
28+
*/
29+
private $arguments;
30+
31+
public function __construct($name, QueryObject $qo, QueryBuilderHandler $qb, array $arguments)
32+
{
33+
$this->name = $name;
34+
$this->queryObject = $qo;
35+
$this->queryBuilder = $qb;
36+
$this->arguments = $arguments;
37+
}
38+
39+
/**
40+
* Get event name
41+
*
42+
* @return string
43+
*/
44+
public function getEventName(): string
45+
{
46+
return $this->name;
47+
}
48+
49+
/**
50+
* Get QueryBuilder object
51+
*
52+
* @return QueryBuilderHandler
53+
*/
54+
public function getQueryBuilder(): QueryBuilderHandler
55+
{
56+
return $this->queryBuilder;
57+
}
58+
59+
/**
60+
* Get query object
61+
*
62+
* @return QueryObject
63+
*/
64+
public function getQuery(): QueryObject
65+
{
66+
return $this->queryObject;
67+
}
68+
69+
/**
70+
* Get insert id from last query
71+
*
72+
* @return string|null
73+
*/
74+
public function getInsertId()
75+
{
76+
return $this->data['insert_id'] ?? null;
77+
}
78+
79+
/**
80+
* Get execution time
81+
*
82+
* @return float|null
83+
*/
84+
public function getExecutionTime()
85+
{
86+
return $this->data['execution_time'] ?? null;
87+
}
88+
89+
/**
90+
* Get arguments
91+
*
92+
* @return array
93+
*/
94+
public function getArguments(): array
95+
{
96+
return $this->arguments;
97+
}
98+
99+
}
Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php
22

3-
namespace Pecee\Pixie;
3+
namespace Pecee\Pixie\Event;
44

55
use Pecee\Pixie\QueryBuilder\QueryBuilderHandler;
66
use Pecee\Pixie\QueryBuilder\QueryObject;
@@ -113,15 +113,13 @@ class EventHandler
113113
protected $firedEvents = [];
114114

115115
/**
116-
* @param QueryBuilderHandler $queryBuilder
117116
* @param string $event
118117
* @param QueryObject $queryObject
119118
* @param QueryBuilderHandler $queryBuilder
120-
* @param ...$parameters
121-
*
122-
* @return \Closure|null
119+
* @param array $eventArguments
120+
* @return array Event responses array
123121
*/
124-
public function fireEvents(string $event, QueryObject $queryObject, QueryBuilderHandler $queryBuilder, ...$parameters)
122+
public function fireEvents(string $event, QueryObject $queryObject, QueryBuilderHandler $queryBuilder, array $eventArguments = []): array
125123
{
126124
$statements = $queryBuilder->getStatements();
127125
$tables = $statements['tables'] ?? [];
@@ -130,14 +128,7 @@ public function fireEvents(string $event, QueryObject $queryObject, QueryBuilder
130128
// we are adding :any as a fake table at the beginning.
131129
array_unshift($tables, static::TABLE_ANY);
132130

133-
$handlerParams = [
134-
$queryObject,
135-
$queryBuilder,
136-
];
137-
138-
if ($parameters !== null && count($parameters) > 0) {
139-
$handlerParams = array_merge($handlerParams, $parameters);
140-
}
131+
$eventResponses = [];
141132

142133
// Fire all events
143134
foreach ($tables as $table) {
@@ -153,14 +144,14 @@ public function fireEvents(string $event, QueryObject $queryObject, QueryBuilder
153144
// Fire event and add to fired list
154145
$this->firedEvents[] = $eventId;
155146

156-
$result = \call_user_func_array($action, $handlerParams);
147+
$result = $action(new EventArguments($event, $queryObject, $queryBuilder, $eventArguments));
157148

158149
if ($result !== null) {
159-
return $result;
150+
$eventResponses[] = $result;
160151
}
161152
}
162153

163-
return null;
154+
return $eventResponses;
164155
}
165156

166157
/**

0 commit comments

Comments
 (0)