|
3 | 3 | namespace Kettasoft\Filterable\Foundation; |
4 | 4 |
|
5 | 5 | use Closure; |
| 6 | +use Serializable; |
| 7 | +use Illuminate\Support\Facades\DB; |
| 8 | +use Illuminate\Support\Facades\App; |
| 9 | +use Illuminate\Database\Query\Builder; |
6 | 10 | use Illuminate\Support\Traits\ForwardsCalls; |
7 | 11 | use Illuminate\Database\Eloquent\Builder as EloquentBuilder; |
8 | 12 | use Kettasoft\Filterable\Foundation\Traits\HandleFluentReturn; |
9 | 13 | use Kettasoft\Filterable\Foundation\Contracts\QueryBuilderInterface; |
10 | 14 |
|
| 15 | +use function Opis\Closure\{serialize, unserialize}; |
| 16 | + |
11 | 17 | /** |
12 | 18 | * Class Invoker |
13 | 19 | * |
|
17 | 23 | * |
18 | 24 | * @link https://kettasoft.github.io/filterable/execution/invoker |
19 | 25 | */ |
20 | | -class Invoker implements QueryBuilderInterface |
| 26 | +class Invoker implements QueryBuilderInterface, Serializable |
21 | 27 | { |
22 | 28 | use ForwardsCalls, |
23 | 29 | HandleFluentReturn; |
@@ -48,7 +54,7 @@ class Invoker implements QueryBuilderInterface |
48 | 54 | * |
49 | 55 | * @param \Illuminate\Database\Query\Builder|\Illuminate\Database\Eloquent\Builder|QueryBuilderInterface $builder |
50 | 56 | */ |
51 | | - public function __construct(protected EloquentBuilder|QueryBuilderInterface $builder) {} |
| 57 | + public function __construct(protected EloquentBuilder|Builder|QueryBuilderInterface $builder) {} |
52 | 58 |
|
53 | 59 | /** |
54 | 60 | * Instantiate a new Invoker object using a builder. |
@@ -133,6 +139,16 @@ public function onError(Closure $callback) |
133 | 139 | return $this; |
134 | 140 | } |
135 | 141 |
|
| 142 | + /** |
| 143 | + * Get the underlying query builder instance. |
| 144 | + * |
| 145 | + * @return Builder|EloquentBuilder|QueryBuilderInterface |
| 146 | + */ |
| 147 | + public function getBuilder(): EloquentBuilder|Builder|QueryBuilderInterface |
| 148 | + { |
| 149 | + return $this->builder; |
| 150 | + } |
| 151 | + |
136 | 152 | /** |
137 | 153 | * Dispatch the query execution as a Laravel job. |
138 | 154 | * |
@@ -161,6 +177,42 @@ public function asJob(string $jobClass, array $jobData = [], string|null $queue |
161 | 177 | return dispatch($job); |
162 | 178 | } |
163 | 179 |
|
| 180 | + /** |
| 181 | + * Serialize the Invoker instance. |
| 182 | + * |
| 183 | + * @return string |
| 184 | + */ |
| 185 | + public function serialize(): string |
| 186 | + { |
| 187 | + return serialize([ |
| 188 | + 'builder_sql' => $this->builder->toSql(), |
| 189 | + 'builder_bindings' => $this->builder->getBindings(), |
| 190 | + 'beforeCallback' => $this->beforeCallback ? serialize($this->beforeCallback) : null, |
| 191 | + 'afterCallback' => $this->afterCallback ? serialize($this->afterCallback) : null, |
| 192 | + 'errorCallback' => $this->errorCallback ? serialize($this->errorCallback) : null |
| 193 | + ]); |
| 194 | + } |
| 195 | + |
| 196 | + /** |
| 197 | + * Unserialize the Invoker instance. |
| 198 | + * |
| 199 | + * @param string $data |
| 200 | + * @return void |
| 201 | + */ |
| 202 | + public function unserialize($data): void |
| 203 | + { |
| 204 | + $unserialized = unserialize($data); |
| 205 | + $connection = App::make('db')->connection(); |
| 206 | + |
| 207 | + $this->builder = $connection->table(DB::raw("({$unserialized['builder_sql']}) as t")); |
| 208 | + |
| 209 | + $this->builder->setBindings($unserialized['builder_bindings']); |
| 210 | + |
| 211 | + $this->beforeCallback = $unserialized['beforeCallback']; |
| 212 | + $this->afterCallback = $unserialized['afterCallback']; |
| 213 | + $this->errorCallback = $unserialized['errorCallback']; |
| 214 | + } |
| 215 | + |
164 | 216 | /** |
165 | 217 | * Handles dynamic calls to the builder, and tracks execution time |
166 | 218 | * for terminal methods only. |
|
0 commit comments