Skip to content

Commit bff8127

Browse files
authored
Fix eager loading relation for search operation (#198)
1 parent bea6a08 commit bff8127

File tree

7 files changed

+85
-2
lines changed

7 files changed

+85
-2
lines changed

src/Http/Response.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public function modelToResponse(Model $model, Resource $resource, array $request
8181
$currentRequestArray = $relation === null ? $requestArray : collect($requestArray['includes'] ?? [])
8282
->first(function ($include) use ($relation) {
8383
return preg_match('/(?:\.\b)?'.$relation->relation.'\b/', $include['relation']);
84-
});
84+
}) ?? [];
8585

8686
return array_merge(
8787
// toArray to take advantage of Laravel's logic

tests/Feature/Controllers/SearchIncludingRelationshipsOperationsTest.php

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@
1010
use Lomkit\Rest\Tests\Support\Database\Factories\BelongsToManyRelationFactory;
1111
use Lomkit\Rest\Tests\Support\Database\Factories\BelongsToRelationFactory;
1212
use Lomkit\Rest\Tests\Support\Database\Factories\HasManyRelationFactory;
13+
use Lomkit\Rest\Tests\Support\Database\Factories\HasManyThroughRelationFactory;
1314
use Lomkit\Rest\Tests\Support\Database\Factories\HasOneOfManyRelationFactory;
1415
use Lomkit\Rest\Tests\Support\Database\Factories\HasOneRelationFactory;
1516
use Lomkit\Rest\Tests\Support\Database\Factories\ModelFactory;
1617
use Lomkit\Rest\Tests\Support\Database\Factories\ModelWithFactory;
1718
use Lomkit\Rest\Tests\Support\Models\BelongsToManyRelation;
1819
use Lomkit\Rest\Tests\Support\Models\BelongsToRelation;
1920
use Lomkit\Rest\Tests\Support\Models\HasManyRelation;
21+
use Lomkit\Rest\Tests\Support\Models\HasManyThroughRelation;
2022
use Lomkit\Rest\Tests\Support\Models\HasOneOfManyRelation;
2123
use Lomkit\Rest\Tests\Support\Models\HasOneRelation;
2224
use Lomkit\Rest\Tests\Support\Models\Model;
@@ -25,6 +27,7 @@
2527
use Lomkit\Rest\Tests\Support\Rest\Resources\BelongsToManyResource;
2628
use Lomkit\Rest\Tests\Support\Rest\Resources\BelongsToResource;
2729
use Lomkit\Rest\Tests\Support\Rest\Resources\HasManyResource;
30+
use Lomkit\Rest\Tests\Support\Rest\Resources\HasManyThroughResource;
2831
use Lomkit\Rest\Tests\Support\Rest\Resources\HasOneOfManyResource;
2932
use Lomkit\Rest\Tests\Support\Rest\Resources\HasOneResource;
3033
use Lomkit\Rest\Tests\Support\Rest\Resources\ModelResource;
@@ -578,6 +581,69 @@ public function test_getting_a_list_of_resources_including_has_many_relation():
578581
);
579582
}
580583

584+
public function test_getting_a_list_of_resources_including_has_many_relation_with_eager_loading_relations(): void
585+
{
586+
$matchingModel = ModelFactory::new()
587+
->createOne()->fresh();
588+
589+
$hasMany = HasManyRelationFactory::new()
590+
->for($matchingModel)
591+
->createOne();
592+
593+
HasManyThroughRelationFactory::new()
594+
->for($hasMany)
595+
->createOne();
596+
597+
Gate::policy(Model::class, GreenPolicy::class);
598+
Gate::policy(HasManyRelation::class, GreenPolicy::class);
599+
Gate::policy(HasManyThroughRelation::class, GreenPolicy::class);
600+
601+
$response = $this->post(
602+
'/api/models/search',
603+
[
604+
'search' => [
605+
'includes' => [
606+
[
607+
'relation' => 'hasManyRelationWithEagerLoadingRelation',
608+
],
609+
],
610+
],
611+
],
612+
['Accept' => 'application/json']
613+
);
614+
615+
$this->assertResourcePaginated(
616+
$response,
617+
[$matchingModel],
618+
new ModelResource(),
619+
[
620+
[
621+
'has_many_relation_with_eager_loading_relation' => $matchingModel->hasManyRelationWithEagerLoadingRelation()
622+
->orderBy('id')
623+
->get()
624+
->map(function ($relation) {
625+
$relation->has_many_through_relation = $relation->hasManyThroughRelation
626+
->map(function ($relation) {
627+
$relation->has_many_relation = $relation->hasManyRelation->only(
628+
(new HasManyResource())->getFields(app()->make(RestRequest::class))
629+
);
630+
631+
return $relation->only(array_merge(
632+
(new HasManyThroughResource())->getFields(app()->make(RestRequest::class)),
633+
['has_many_relation']
634+
));
635+
})->toArray();
636+
637+
return $relation->only(array_merge(
638+
(new HasManyResource())->getFields(app()->make(RestRequest::class)),
639+
['has_many_through_relation']
640+
));
641+
})->toArray(),
642+
],
643+
]
644+
);
645+
}
646+
581647
public function test_getting_a_list_of_resources_including_belongs_to_many_relation(): void
582648
{
583649
$matchingModel = ModelFactory::new()

tests/Support/Models/HasManyRelation.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,9 @@ public function model()
1010
{
1111
return $this->belongsTo(\Lomkit\Rest\Tests\Support\Models\Model::class);
1212
}
13+
14+
public function hasManyThroughRelation()
15+
{
16+
return $this->hasMany(HasManyThroughRelation::class, 'has_many_relation_id');
17+
}
1318
}

tests/Support/Models/Model.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ public function hasManyRelation()
4747
return $this->hasMany(HasManyRelation::class, 'model_id');
4848
}
4949

50+
public function hasManyRelationWithEagerLoadingRelation()
51+
{
52+
return $this->hasMany(HasManyRelation::class, 'model_id')
53+
->with('hasManyThroughRelation.hasManyRelation');
54+
}
55+
5056
public function hasOneOfManyRelation()
5157
{
5258
return $this->hasOne(HasOneOfManyRelation::class, 'model_id')->ofMany();

tests/Support/Rest/Resources/HasManyResource.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Lomkit\Rest\Http\Requests\RestRequest;
77
use Lomkit\Rest\Http\Resource;
88
use Lomkit\Rest\Relations\BelongsTo;
9+
use Lomkit\Rest\Relations\HasMany;
910
use Lomkit\Rest\Tests\Support\Models\HasManyRelation;
1011

1112
class HasManyResource extends Resource
@@ -17,6 +18,7 @@ public function relations(RestRequest $request): array
1718
{
1819
return [
1920
BelongsTo::make('model', ModelResource::class),
21+
HasMany::make('hasManyThroughRelation', HasManyThroughResource::class),
2022
];
2123
}
2224

tests/Support/Rest/Resources/HasManyThroughResource.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Lomkit\Rest\Concerns\Resource\DisableGates;
66
use Lomkit\Rest\Http\Requests\RestRequest;
77
use Lomkit\Rest\Http\Resource;
8+
use Lomkit\Rest\Relations\BelongsTo;
89
use Lomkit\Rest\Tests\Support\Models\HasManyThroughRelation;
910

1011
class HasManyThroughResource extends Resource
@@ -14,7 +15,9 @@ class HasManyThroughResource extends Resource
1415

1516
public function relations(RestRequest $request): array
1617
{
17-
return [];
18+
return [
19+
BelongsTo::make('hasManyRelation', HasManyResource::class),
20+
];
1821
}
1922

2023
public function fields(RestRequest $request): array

tests/Support/Rest/Resources/ModelResource.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public function relations(RestRequest $request): array
5353
HasOneOfMany::make('hasOneOfManyRelation', HasOneOfManyResource::class),
5454
BelongsTo::make('belongsToRelation', BelongsToResource::class),
5555
HasMany::make('hasManyRelation', HasManyResource::class),
56+
HasMany::make('hasManyRelationWithEagerLoadingRelation', HasManyResource::class),
5657
BelongsToMany::make('belongsToManyRelation', BelongsToManyResource::class)
5758
->withPivotRules([
5859
'number' => 'numeric',

0 commit comments

Comments
 (0)