3
3
namespace Tobyz \JsonApiServer \Laravel ;
4
4
5
5
use Illuminate \Contracts \Database \Query \Builder ;
6
+ use Illuminate \Support \Collection ;
6
7
7
8
class UnionBuilder implements Builder
8
9
{
9
- private array $ queryCalls = [];
10
10
private array $ outerQueryCalls = [];
11
11
private ?int $ limit = null ;
12
12
private int $ offset = 0 ;
@@ -15,6 +15,27 @@ public function __construct(protected array $queries)
15
15
{
16
16
}
17
17
18
+ public function for (string $ type ): Builder
19
+ {
20
+ return $ this ->queries [$ type ];
21
+ }
22
+
23
+ public function inner (callable $ callback ): static
24
+ {
25
+ foreach ($ this ->queries as $ query ) {
26
+ $ callback ($ query );
27
+ }
28
+
29
+ return $ this ;
30
+ }
31
+
32
+ public function outer (callable $ callback ): static
33
+ {
34
+ $ this ->outerQueryCalls [] = $ callback ;
35
+
36
+ return $ this ;
37
+ }
38
+
18
39
public function skip (int $ value ): static
19
40
{
20
41
return $ this ->offset ($ value );
@@ -41,36 +62,21 @@ public function limit(?int $value): static
41
62
return $ this ;
42
63
}
43
64
44
- public function orderBy ($ column , $ direction = 'asc ' ): static
45
- {
46
- $ this ->queryCalls [] = fn ($ query ) => $ query
47
- ->addSelect ($ column )
48
- ->orderBy ($ column , $ direction );
49
-
50
- $ this ->outerQueryCalls [] = fn ($ query ) => $ query ->orderBy ($ column , $ direction );
51
-
52
- return $ this ;
53
- }
54
-
55
65
public function count ($ columns = '* ' ): int
56
66
{
57
67
return $ this ->buildQuery ()->count ($ columns );
58
68
}
59
69
60
- public function get ($ columns = ['* ' ])
70
+ public function get ($ columns = ['* ' ]): Collection
61
71
{
62
72
return $ this ->buildQuery ()->get ($ columns );
63
73
}
64
74
65
- protected function buildQuery ()
75
+ protected function buildQuery (): Builder
66
76
{
67
77
$ queries = array_map (fn ($ query ) => clone $ query , $ this ->queries );
68
78
69
79
foreach ($ queries as $ query ) {
70
- foreach ($ this ->queryCalls as $ call ) {
71
- $ call ($ query );
72
- }
73
-
74
80
if ($ this ->limit ) {
75
81
$ query ->take ($ this ->offset + $ this ->limit );
76
82
}
@@ -95,7 +101,10 @@ protected function buildQuery()
95
101
96
102
public function __call ($ method , $ parameters )
97
103
{
98
- $ this ->queryCalls [] = fn ($ query ) => $ query ->$ method (...$ parameters );
104
+ $ callback = fn ($ query ) => $ query ->$ method (...$ parameters );
105
+
106
+ $ this ->inner ($ callback );
107
+ $ this ->outer ($ callback );
99
108
100
109
return $ this ;
101
110
}
0 commit comments