88use Flavorly \VanillaComponents \Datatables \Filters \Filter ;
99use Flavorly \VanillaComponents \Datatables \Http \Payload \RequestPayload ;
1010use Illuminate \Database \Eloquent \Builder ;
11+ use Illuminate \Database \Eloquent \Model ;
1112use Illuminate \Database \Eloquent \Relations \Relation ;
1213use Illuminate \Pagination \LengthAwarePaginator ;
1314use Illuminate \Pagination \UrlWindow ;
1415use Illuminate \Support \Collection ;
16+ use Illuminate \Support \Str ;
1517use Laravel \Scout \Builder as ScoutBuilder ;
1618use Laravel \Scout \Searchable ;
1719
1820trait InteractsWithQueryBuilder
1921{
2022 /**
2123 * Stores the query object
24+ *
25+ * @var Builder|ScoutBuilder|Closure|null|mixed
2226 */
23- protected Builder | ScoutBuilder | null | Closure $ query = null ;
27+ protected mixed $ query = null ;
2428
2529 /**
2630 * Stores the data comming from the client side
@@ -38,9 +42,9 @@ public function query(): mixed
3842 /**
3943 * Return the query model/instance
4044 *
41- * @return Closure|Builder|ScoutBuilder|null
45+ * @return Closure|Builder|ScoutBuilder|null|mixed
4246 */
43- protected function getQuery ()
47+ protected function getQuery (): mixed
4448 {
4549 return $ this ->query ;
4650 }
@@ -97,14 +101,18 @@ protected function resolveQueryOrModel(mixed $queryOrModel = null): Builder
97101 /**
98102 * Apply the user provided filters using the follow method
99103 */
100- protected function applyQueryFilters (Builder $ query , RequestPayload $ payload ): Builder
104+ protected function applyQueryFilters (Builder $ query , RequestPayload $ payload ): void
101105 {
102- return $ query ->when ($ payload ->hasFilters (), function (Builder $ subQuery ) use ($ payload ) {
106+ $ query ->when ($ payload ->hasFilters (), function (Builder $ subQuery ) use ($ payload ) {
103107 // Each column that needs to be sorted
104108 $ payload
105109 ->getFilters ()
106110 // Apply Sorting
107- ->each (fn (Filter $ filter ) => $ filter ->apply ($ subQuery , $ filter ->getName (), $ filter ->getValue ()));
111+ ->each (fn (Filter $ filter ) => $ filter ->apply (
112+ $ subQuery ,
113+ $ filter ->getName (),
114+ $ filter ->getValue ()
115+ ));
108116
109117 return $ subQuery ;
110118 });
@@ -113,13 +121,13 @@ protected function applyQueryFilters(Builder $query, RequestPayload $payload): B
113121 /**
114122 * Apply the sorting using the following method
115123 */
116- protected function applyQuerySorting (Builder $ query , RequestPayload $ payload ): Builder
124+ protected function applyQuerySorting (Builder $ query , RequestPayload $ payload ): void
117125 {
118- return $ query ->when ($ payload ->hasSorting (), function (Builder $ subQuery ) use ($ payload ) {
126+ $ query ->when ($ payload ->hasSorting (), function (Builder $ subQuery ) use ($ payload ) {
119127 // Each column that needs to be sorted
120128 $ payload
121129 ->getSorting ()
122- ->each (fn (Column $ column ) => $ subQuery -> orderBy ( $ column ->getName (), $ column ->getSortDirection ()));
130+ ->each (fn (Column $ column ) => $ column -> applySort ( $ subQuery , $ column ->getName (), $ column ->getSortDirection ()));
123131
124132 return $ subQuery ;
125133 });
@@ -128,17 +136,18 @@ protected function applyQuerySorting(Builder $query, RequestPayload $payload): B
128136 /**
129137 * Apply the search using the following method, supporting scout if the class uses scout.
130138 */
131- protected function applySearch (Builder $ query , RequestPayload $ payload ): Builder
139+ protected function applySearch (Builder $ query , RequestPayload $ payload ): void
132140 {
141+ /** @var Model $model */
133142 $ model = $ this ->getQuery ()->getModel ();
134143 $ usingScout = in_array (Searchable::class, class_uses ($ model ::class));
135144
136- return $ query
145+ $ query
137146 // Model is using Scout, we can use it.
138147 ->when ($ usingScout && $ payload ->hasSearch (), function (Builder $ subQuery ) use ($ model ) {
139148 // Each column that needs to be sorted
140- /** @var Searchable $model */
141- $ subQuery ->whereIn (' id ' , $ model ::search ($ this ->data ->getSearch ())->keys ());
149+ /** @var Searchable|Model $model */
150+ $ subQuery ->whereIn ($ model -> getKeyName () , $ model ::search ($ this ->data ->getSearch ())->keys ());
142151
143152 return $ subQuery ;
144153 })
@@ -148,6 +157,7 @@ protected function applySearch(Builder $query, RequestPayload $payload): Builder
148157 $ subQuery
149158 ->where (fn ($ query ) => $ this
150159 ->getColumns ()
160+ ->filter (fn (Column $ column ) => ! Str::of ($ column ->getName ())->contains ('. ' ))
151161 ->each (fn (Column $ column ) => $ query ->orWhere ($ column ->getName (), 'like ' , "% {$ payload ->getSearch ()}% " ))
152162 );
153163
@@ -279,16 +289,14 @@ public function response(?Builder $queryOrModel = null): array|Collection
279289 $ this ->withQuery ($ queryOrModel );
280290 }
281291
282- $ query = $ this ->getQuery ();
283-
284- $ this ->query = tap ($ query , function () use (&$ query ) {
292+ $ this ->query = tap ($ this ->getQuery (), function ($ query ) {
285293 $ this ->applyQueryFilters ($ query , $ this ->data );
286294 $ this ->applyQuerySorting ($ query , $ this ->data );
287295 $ this ->applySearch ($ query , $ this ->data );
288296 });
289297
290298 /** @var LengthAwarePaginator $collection */
291- $ collection = $ query ->paginate ($ this ->data ->getPerPage ());
299+ $ collection = $ this -> query ->paginate ($ this ->data ->getPerPage ());
292300
293301 if (method_exists ($ this , 'transform ' )) {
294302 $ collection ->transform (fn ($ record ) => $ this ->transform ($ record ));
0 commit comments