diff --git a/src/Filters/SortableFilter.php b/src/Filters/SortableFilter.php index 9d378a219..deb88f80a 100644 --- a/src/Filters/SortableFilter.php +++ b/src/Filters/SortableFilter.php @@ -53,12 +53,10 @@ public function filter(RestifyRequest $request, $query, $direction) $query->orderBy($this->column, $direction); } - public function usingBelongsTo(BelongsTo $field) + public function usingBelongsTo(BelongsTo $field): self { $this->belongsToField = $field; -// $this->setColumn($field->attam ) //todo - return $this; } diff --git a/src/Sort/SortCollection.php b/src/Sort/SortCollection.php index 8b458876f..7333bc7f2 100644 --- a/src/Sort/SortCollection.php +++ b/src/Sort/SortCollection.php @@ -22,6 +22,11 @@ public function __construct($items = []) ? $item : SortableFilter::make(); + if ($queryKey instanceof SortableFilter) { + $unified[] = $queryKey; + continue; + } + $definition->setColumn( $definition->column ?? $queryKey ); @@ -34,7 +39,7 @@ public function __construct($items = []) public function hydrateRepository(Repository $repository): self { - return $this->map(fn (Filter $filter) => $filter->setRepository($repository)); + return $this->each(fn (Filter $filter) => $filter->setRepository($repository)); } public function allowed(RestifyRequest $request, Repository $repository) @@ -73,6 +78,6 @@ public function forEager(RestifyRequest $request): self public function normalize() { - return $this->map(fn (SortableFilter $filter) => $filter->syncDirection()); + return $this->each(fn (SortableFilter $filter) => $filter->syncDirection()); } } diff --git a/src/Traits/InteractWithSearch.php b/src/Traits/InteractWithSearch.php index 62462f7f0..3221931c8 100644 --- a/src/Traits/InteractWithSearch.php +++ b/src/Traits/InteractWithSearch.php @@ -98,8 +98,8 @@ public static function collectSorts(RestifyRequest $request, Repository $reposit { return SortCollection::make(explode(',', $request->input('sort', ''))) ->normalize() - ->allowed($request, $repository) ->hydrateDefinition($repository) + ->allowed($request, $repository) ->hydrateRepository($repository); } diff --git a/tests/Feature/Filters/FilterDefinitionTest.php b/tests/Feature/Filters/FilterDefinitionTest.php index 3d2ee16ec..09e62c2df 100644 --- a/tests/Feature/Filters/FilterDefinitionTest.php +++ b/tests/Feature/Filters/FilterDefinitionTest.php @@ -6,13 +6,11 @@ use Binaryk\LaravelRestify\Filters\MatchFilter; use Binaryk\LaravelRestify\Filters\SearchableFilter; use Binaryk\LaravelRestify\Filters\SortableFilter; -use Binaryk\LaravelRestify\Http\Requests\RestifyRequest; use Binaryk\LaravelRestify\Tests\Fixtures\Post\Post; use Binaryk\LaravelRestify\Tests\Fixtures\Post\PostRepository; use Binaryk\LaravelRestify\Tests\Fixtures\User\User; use Binaryk\LaravelRestify\Tests\Fixtures\User\UserRepository; use Binaryk\LaravelRestify\Tests\IntegrationTest; -use Illuminate\Database\Eloquent\Builder; class FilterDefinitionTest extends IntegrationTest { @@ -72,14 +70,9 @@ public function test_can_filter_using_belongs_to_field() ]; PostRepository::$sort = [ - 'users.name' => SortableFilter::make()->usingBelongsTo( + 'users.attributes.name' => SortableFilter::make()->setColumn('users.name')->usingBelongsTo( BelongsTo::make('user', 'user', UserRepository::class), - ) - /*function (RestifyRequest $request, Builder $builder, $direction) { - $builder->join('users', 'posts.user_id', '=', 'users.id') - ->select('posts.*') - ->orderBy('users.name', $direction); - }*/, + ), ]; factory(Post::class)->create([ @@ -94,7 +87,9 @@ public function test_can_filter_using_belongs_to_field() ]), ]); - $json = $this->getJson(PostRepository::uriKey().'?related=user&sort=-users.name') + $json = $this + ->withoutExceptionHandling() + ->getJson(PostRepository::uriKey().'?related=user&sort=-users.attributes.name') ->json(); $this->assertSame(