diff --git a/src/Http/Response.php b/src/Http/Response.php index 97a19b6..37eb293 100644 --- a/src/Http/Response.php +++ b/src/Http/Response.php @@ -109,7 +109,7 @@ public function modelToResponse(Model $model, Resource $resource, array $request }) ->toArray(), collect($model->getRelations()) - ->mapWithKeys(function ($modelRelation, $relationName) use ($requestArray, $relation, $resource) { + ->mapWithKeys(function ($modelRelation, $relationName) use ($currentRequestArray, $relation, $resource) { $key = Str::snake($relationName); if (is_null($modelRelation)) { @@ -132,7 +132,7 @@ public function modelToResponse(Model $model, Resource $resource, array $request $key => $this->modelToResponse( $modelRelation, $relationResource, - $requestArray, + $currentRequestArray, $relationConcrete ), ]; @@ -140,7 +140,7 @@ public function modelToResponse(Model $model, Resource $resource, array $request return [ $key => $modelRelation - ->map(fn ($collectionRelation) => $this->modelToResponse($collectionRelation, $relationResource, $requestArray, $relationConcrete)) + ->map(fn ($collectionRelation) => $this->modelToResponse($collectionRelation, $relationResource, $currentRequestArray, $relationConcrete)) ->toArray(), ]; }) diff --git a/tests/Feature/Controllers/SearchIncludingRelationshipsOperationsTest.php b/tests/Feature/Controllers/SearchIncludingRelationshipsOperationsTest.php index 890aadc..aa1e96d 100644 --- a/tests/Feature/Controllers/SearchIncludingRelationshipsOperationsTest.php +++ b/tests/Feature/Controllers/SearchIncludingRelationshipsOperationsTest.php @@ -90,7 +90,7 @@ public function test_getting_a_list_of_resources_including_relation_with_unautho 'search' => [ 'includes' => [ [ - 'relation' => 'hasManyRelation.model', + 'relation' => 'hasManyRelation.belongsToRelation', ], [ 'relation' => 'hasManyRelation', diff --git a/tests/Feature/Controllers/SearchSelectingOperationsTest.php b/tests/Feature/Controllers/SearchSelectingOperationsTest.php index 128416d..ef03a71 100644 --- a/tests/Feature/Controllers/SearchSelectingOperationsTest.php +++ b/tests/Feature/Controllers/SearchSelectingOperationsTest.php @@ -4,7 +4,9 @@ use Illuminate\Support\Facades\Gate; use Lomkit\Rest\Tests\Feature\TestCase; +use Lomkit\Rest\Tests\Support\Database\Factories\HasManyRelationFactory; use Lomkit\Rest\Tests\Support\Database\Factories\ModelFactory; +use Lomkit\Rest\Tests\Support\Models\HasManyRelation; use Lomkit\Rest\Tests\Support\Models\Model; use Lomkit\Rest\Tests\Support\Policies\GreenPolicy; use Lomkit\Rest\Tests\Support\Rest\Resources\ModelResource; @@ -89,4 +91,64 @@ public function test_getting_a_list_of_resources_selecting_two_fields(): void ['id', 'number'] ); } + + public function test_getting_a_list_of_resources_deep_selecting_fields(): void + { + $matchingModel = ModelFactory::new()->has(HasManyRelationFactory::new()->count(2), 'hasManyRelation')->create()->fresh(); + $matchingModel2 = ModelFactory::new()->create()->fresh(); + + Gate::policy(Model::class, GreenPolicy::class); + Gate::policy(HasManyRelation::class, GreenPolicy::class); + + $response = $this->post( + '/api/models/search', + [ + 'search' => [ + 'selects' => [ + ['field' => 'id'], + ], + 'includes' => [ + [ + 'relation' => 'hasManyRelation', + 'selects' => [ + ['field' => 'id'], + ], + 'includes' => [ + [ + 'relation' => 'model', + 'selects' => [ + ['field' => 'id'], + ], + ], + ], + ], + ], + ], + ], + ['Accept' => 'application/json'] + ); + + $this->assertResourcePaginated( + $response, + [$matchingModel, $matchingModel2], + new ModelResource(), + [ + [ + 'has_many_relation' => $matchingModel->hasManyRelation() + ->orderBy('id') + ->with('model:id') + ->get() + ->map(function ($relation) { + $relation->model = $relation->model->toArray(); + + return $relation->only(['id', 'model']); + })->toArray(), + ], + [ + 'has_many_relation' => [], + ], + ], + ['id', 'has_many_relation'] + ); + } } diff --git a/tests/Support/Rest/Resources/HasManyResource.php b/tests/Support/Rest/Resources/HasManyResource.php index 5275ebf..d33006b 100644 --- a/tests/Support/Rest/Resources/HasManyResource.php +++ b/tests/Support/Rest/Resources/HasManyResource.php @@ -5,6 +5,7 @@ use Lomkit\Rest\Concerns\Resource\DisableGates; use Lomkit\Rest\Http\Requests\RestRequest; use Lomkit\Rest\Http\Resource; +use Lomkit\Rest\Relations\BelongsTo; use Lomkit\Rest\Tests\Support\Models\HasManyRelation; class HasManyResource extends Resource @@ -14,7 +15,9 @@ class HasManyResource extends Resource public function relations(RestRequest $request): array { - return []; + return [ + BelongsTo::make('model', ModelResource::class), + ]; } public function fields(RestRequest $request): array @@ -24,4 +27,11 @@ public function fields(RestRequest $request): array 'number', ]; } + + public function defaultOrderBy(RestRequest $request): array + { + return [ + 'id' => 'asc', + ]; + } }