2
2
3
3
use Exception ;
4
4
use GeneaLabs \LaravelModelCaching \Traits \CachePrefixing ;
5
+ use Illuminate \Database \Query \Expression ;
5
6
use Illuminate \Support \Arr ;
6
7
use Illuminate \Support \Collection ;
7
8
use Illuminate \Support \Str ;
@@ -170,14 +171,19 @@ protected function getOrderByClauses() : string
170
171
}
171
172
172
173
$ orders = collect ($ this ->query ->orders );
173
-
174
+
174
175
return $ orders
175
176
->reduce (function ($ carry , $ order ) {
176
177
if (($ order ["type " ] ?? "" ) === "Raw " ) {
177
178
return $ carry . "_orderByRaw_ " . (new Str )->slug ($ order ["sql " ]);
178
179
}
179
180
180
- return $ carry . "_orderBy_ " . $ order ["column " ] . "_ " . $ order ["direction " ];
181
+ return sprintf (
182
+ '%s_orderBy_%s_%s ' ,
183
+ $ carry ,
184
+ $ this ->expressionToString ($ order ["column " ]),
185
+ $ order ["direction " ]
186
+ );
181
187
})
182
188
?: "" ;
183
189
}
@@ -211,7 +217,11 @@ protected function getQueryColumns(array $columns) : string
211
217
if (property_exists ($ this ->query , "columns " )
212
218
&& $ this ->query ->columns
213
219
) {
214
- return "_ " . implode ("_ " , $ this ->query ->columns );
220
+ $ columns = array_map (function ($ column ) {
221
+ return $ this ->expressionToString ($ column );
222
+ }, $ this ->query ->columns );
223
+
224
+ return "_ " . implode ("_ " , $ columns );
215
225
}
216
226
217
227
return "_ " . implode ("_ " , $ columns );
@@ -393,12 +403,14 @@ protected function recursiveImplode(array $items, string $glue = ",") : string
393
403
return $ result ;
394
404
}
395
405
396
- private function processEnum (\BackedEnum |\UnitEnum |string $ value ): string
406
+ private function processEnum (\BackedEnum |\UnitEnum |Expression | string $ value ): string
397
407
{
398
408
if ($ value instanceof \BackedEnum) {
399
409
return $ value ->value ;
400
410
} elseif ($ value instanceof \UnitEnum) {
401
411
return $ value ->name ;
412
+ } elseif ($ value instanceof Expression) {
413
+ return $ this ->expressionToString ($ value );
402
414
}
403
415
404
416
return $ value ;
@@ -408,4 +420,13 @@ private function processEnums(array $values): array
408
420
{
409
421
return array_map (fn ($ value ) => $ this ->processEnum ($ value ), $ values );
410
422
}
423
+
424
+ private function expressionToString (Expression |string $ value ): string
425
+ {
426
+ if (is_string ($ value )) {
427
+ return $ value ;
428
+ }
429
+
430
+ return $ value ->getValue ($ this ->query ->getConnection ()->getQueryGrammar ());
431
+ }
411
432
}
0 commit comments