diff --git a/src/Http/Response.php b/src/Http/Response.php index 37eb293..e87ff81 100644 --- a/src/Http/Response.php +++ b/src/Http/Response.php @@ -81,7 +81,7 @@ public function modelToResponse(Model $model, Resource $resource, array $request $currentRequestArray = $relation === null ? $requestArray : collect($requestArray['includes'] ?? []) ->first(function ($include) use ($relation) { return preg_match('/(?:\.\b)?'.$relation->relation.'\b/', $include['relation']); - }); + }) ?? []; return array_merge( // toArray to take advantage of Laravel's logic diff --git a/tests/Feature/Controllers/SearchIncludingRelationshipsOperationsTest.php b/tests/Feature/Controllers/SearchIncludingRelationshipsOperationsTest.php index aa1e96d..cc8bf24 100644 --- a/tests/Feature/Controllers/SearchIncludingRelationshipsOperationsTest.php +++ b/tests/Feature/Controllers/SearchIncludingRelationshipsOperationsTest.php @@ -10,6 +10,7 @@ use Lomkit\Rest\Tests\Support\Database\Factories\BelongsToManyRelationFactory; use Lomkit\Rest\Tests\Support\Database\Factories\BelongsToRelationFactory; use Lomkit\Rest\Tests\Support\Database\Factories\HasManyRelationFactory; +use Lomkit\Rest\Tests\Support\Database\Factories\HasManyThroughRelationFactory; use Lomkit\Rest\Tests\Support\Database\Factories\HasOneOfManyRelationFactory; use Lomkit\Rest\Tests\Support\Database\Factories\HasOneRelationFactory; use Lomkit\Rest\Tests\Support\Database\Factories\ModelFactory; @@ -17,6 +18,7 @@ use Lomkit\Rest\Tests\Support\Models\BelongsToManyRelation; use Lomkit\Rest\Tests\Support\Models\BelongsToRelation; use Lomkit\Rest\Tests\Support\Models\HasManyRelation; +use Lomkit\Rest\Tests\Support\Models\HasManyThroughRelation; use Lomkit\Rest\Tests\Support\Models\HasOneOfManyRelation; use Lomkit\Rest\Tests\Support\Models\HasOneRelation; use Lomkit\Rest\Tests\Support\Models\Model; @@ -25,6 +27,7 @@ use Lomkit\Rest\Tests\Support\Rest\Resources\BelongsToManyResource; use Lomkit\Rest\Tests\Support\Rest\Resources\BelongsToResource; use Lomkit\Rest\Tests\Support\Rest\Resources\HasManyResource; +use Lomkit\Rest\Tests\Support\Rest\Resources\HasManyThroughResource; use Lomkit\Rest\Tests\Support\Rest\Resources\HasOneOfManyResource; use Lomkit\Rest\Tests\Support\Rest\Resources\HasOneResource; use Lomkit\Rest\Tests\Support\Rest\Resources\ModelResource; @@ -578,6 +581,69 @@ public function test_getting_a_list_of_resources_including_has_many_relation(): ); } + public function test_getting_a_list_of_resources_including_has_many_relation_with_eager_loading_relations(): void + { + $matchingModel = ModelFactory::new() + ->createOne()->fresh(); + + $hasMany = HasManyRelationFactory::new() + ->for($matchingModel) + ->createOne(); + + HasManyThroughRelationFactory::new() + ->for($hasMany) + ->createOne(); + + Gate::policy(Model::class, GreenPolicy::class); + Gate::policy(HasManyRelation::class, GreenPolicy::class); + Gate::policy(HasManyThroughRelation::class, GreenPolicy::class); + + $response = $this->post( + '/api/models/search', + [ + 'search' => [ + 'includes' => [ + [ + 'relation' => 'hasManyRelationWithEagerLoadingRelation', + ], + ], + ], + ], + ['Accept' => 'application/json'] + ); + + $this->assertResourcePaginated( + $response, + [$matchingModel], + new ModelResource(), + [ + [ + 'has_many_relation_with_eager_loading_relation' => $matchingModel->hasManyRelationWithEagerLoadingRelation() + ->orderBy('id') + ->get() + ->map(function ($relation) { + $relation->has_many_through_relation = $relation->hasManyThroughRelation + ->map(function ($relation) { + $relation->has_many_relation = $relation->hasManyRelation->only( + (new HasManyResource())->getFields(app()->make(RestRequest::class)) + ); + + return $relation->only(array_merge( + (new HasManyThroughResource())->getFields(app()->make(RestRequest::class)), + ['has_many_relation'] + )); + })->toArray(); + + return $relation->only(array_merge( + (new HasManyResource())->getFields(app()->make(RestRequest::class)), + ['has_many_through_relation'] + )); + })->toArray(), + ], + ] + ); + } + public function test_getting_a_list_of_resources_including_belongs_to_many_relation(): void { $matchingModel = ModelFactory::new() diff --git a/tests/Support/Models/HasManyRelation.php b/tests/Support/Models/HasManyRelation.php index 9e40ac4..f4a02f4 100644 --- a/tests/Support/Models/HasManyRelation.php +++ b/tests/Support/Models/HasManyRelation.php @@ -10,4 +10,9 @@ public function model() { return $this->belongsTo(\Lomkit\Rest\Tests\Support\Models\Model::class); } + + public function hasManyThroughRelation() + { + return $this->hasMany(HasManyThroughRelation::class, 'has_many_relation_id'); + } } diff --git a/tests/Support/Models/Model.php b/tests/Support/Models/Model.php index d5e47bb..6bcee8b 100644 --- a/tests/Support/Models/Model.php +++ b/tests/Support/Models/Model.php @@ -47,6 +47,12 @@ public function hasManyRelation() return $this->hasMany(HasManyRelation::class, 'model_id'); } + public function hasManyRelationWithEagerLoadingRelation() + { + return $this->hasMany(HasManyRelation::class, 'model_id') + ->with('hasManyThroughRelation.hasManyRelation'); + } + public function hasOneOfManyRelation() { return $this->hasOne(HasOneOfManyRelation::class, 'model_id')->ofMany(); diff --git a/tests/Support/Rest/Resources/HasManyResource.php b/tests/Support/Rest/Resources/HasManyResource.php index d33006b..189e080 100644 --- a/tests/Support/Rest/Resources/HasManyResource.php +++ b/tests/Support/Rest/Resources/HasManyResource.php @@ -6,6 +6,7 @@ use Lomkit\Rest\Http\Requests\RestRequest; use Lomkit\Rest\Http\Resource; use Lomkit\Rest\Relations\BelongsTo; +use Lomkit\Rest\Relations\HasMany; use Lomkit\Rest\Tests\Support\Models\HasManyRelation; class HasManyResource extends Resource @@ -17,6 +18,7 @@ public function relations(RestRequest $request): array { return [ BelongsTo::make('model', ModelResource::class), + HasMany::make('hasManyThroughRelation', HasManyThroughResource::class), ]; } diff --git a/tests/Support/Rest/Resources/HasManyThroughResource.php b/tests/Support/Rest/Resources/HasManyThroughResource.php index 894fe37..895c891 100644 --- a/tests/Support/Rest/Resources/HasManyThroughResource.php +++ b/tests/Support/Rest/Resources/HasManyThroughResource.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\HasManyThroughRelation; class HasManyThroughResource extends Resource @@ -14,7 +15,9 @@ class HasManyThroughResource extends Resource public function relations(RestRequest $request): array { - return []; + return [ + BelongsTo::make('hasManyRelation', HasManyResource::class), + ]; } public function fields(RestRequest $request): array diff --git a/tests/Support/Rest/Resources/ModelResource.php b/tests/Support/Rest/Resources/ModelResource.php index 9052e2c..f962111 100644 --- a/tests/Support/Rest/Resources/ModelResource.php +++ b/tests/Support/Rest/Resources/ModelResource.php @@ -53,6 +53,7 @@ public function relations(RestRequest $request): array HasOneOfMany::make('hasOneOfManyRelation', HasOneOfManyResource::class), BelongsTo::make('belongsToRelation', BelongsToResource::class), HasMany::make('hasManyRelation', HasManyResource::class), + HasMany::make('hasManyRelationWithEagerLoadingRelation', HasManyResource::class), BelongsToMany::make('belongsToManyRelation', BelongsToManyResource::class) ->withPivotRules([ 'number' => 'numeric',