Skip to content

Commit b31aa6f

Browse files
authored
Merge pull request #70 from Lomkit/fix/auto-loaded-relation
Fix/auto loaded relation
2 parents abb58f3 + f3c4305 commit b31aa6f

File tree

8 files changed

+172
-3
lines changed

8 files changed

+172
-3
lines changed

src/Http/Response.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ protected function buildGatesForModel(Model $model, Resource $resource, array $g
4343

4444
public function modelToResponse(Model $model, Resource $resource, array $requestArray, Relation $relation = null)
4545
{
46-
$currentRequestArray = $relation === null ? $requestArray : collect($requestArray['includes'])
46+
$currentRequestArray = $relation === null ? $requestArray : collect($requestArray['includes'] ?? [])
4747
->first(function ($include) use ($relation) {
4848
return preg_match('/(?:\.\b)?'.$relation->relation.'\b/', $include['relation']);
4949
});

tests/Feature/Controllers/SearchIncludingRelationshipsOperationsTest.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111
use Lomkit\Rest\Tests\Support\Database\Factories\HasOneOfManyRelationFactory;
1212
use Lomkit\Rest\Tests\Support\Database\Factories\HasOneRelationFactory;
1313
use Lomkit\Rest\Tests\Support\Database\Factories\ModelFactory;
14+
use Lomkit\Rest\Tests\Support\Database\Factories\ModelWithFactory;
1415
use Lomkit\Rest\Tests\Support\Models\BelongsToManyRelation;
1516
use Lomkit\Rest\Tests\Support\Models\BelongsToRelation;
1617
use Lomkit\Rest\Tests\Support\Models\HasManyRelation;
1718
use Lomkit\Rest\Tests\Support\Models\HasOneOfManyRelation;
1819
use Lomkit\Rest\Tests\Support\Models\HasOneRelation;
1920
use Lomkit\Rest\Tests\Support\Models\Model;
21+
use Lomkit\Rest\Tests\Support\Models\ModelWith;
2022
use Lomkit\Rest\Tests\Support\Policies\GreenPolicy;
2123
use Lomkit\Rest\Tests\Support\Rest\Resources\BelongsToManyResource;
2224
use Lomkit\Rest\Tests\Support\Rest\Resources\BelongsToResource;
@@ -171,6 +173,41 @@ public function test_getting_a_list_of_resources_including_belongs_to_relation()
171173
);
172174
}
173175

176+
public function test_getting_a_list_of_resources_with_auto_loaded_relation(): void
177+
{
178+
$belongsTo = BelongsToRelationFactory::new()->create();
179+
$matchingModel = ModelWithFactory::new()
180+
->for($belongsTo)
181+
->create()->fresh();
182+
183+
$matchingModel2 = ModelWithFactory::new()->create()->fresh();
184+
185+
Gate::policy(ModelWith::class, GreenPolicy::class);
186+
Gate::policy(BelongsToRelation::class, GreenPolicy::class);
187+
188+
$response = $this->post(
189+
'/api/model-withs/search',
190+
[
191+
'search' => [],
192+
],
193+
['Accept' => 'application/json']
194+
);
195+
196+
$this->assertResourcePaginated(
197+
$response,
198+
[$matchingModel, $matchingModel2],
199+
new ModelResource(),
200+
[
201+
[
202+
'belongs_to_relation' => $matchingModel->belongsToRelation->only((new BelongsToResource())->getFields(app()->make(RestRequest::class))),
203+
],
204+
[
205+
'belongs_to_relation' => null,
206+
],
207+
]
208+
);
209+
}
210+
174211
public function test_getting_a_list_of_resources_including_belongs_to_has_many_relation(): void
175212
{
176213
$belongsTo = BelongsToRelationFactory::new()->create();
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace Lomkit\Rest\Tests\Support\Database\Factories;
4+
5+
use Illuminate\Database\Eloquent\Factories\Factory;
6+
use Lomkit\Rest\Tests\Support\Models\Model;
7+
use Lomkit\Rest\Tests\Support\Models\ModelWith;
8+
9+
class ModelWithFactory extends Factory
10+
{
11+
/**
12+
* The name of the factory's corresponding model.
13+
*
14+
* @var class-string<\Illuminate\Database\Eloquent\Model|TModel>
15+
*/
16+
protected $model = ModelWith::class;
17+
18+
/**
19+
* Define the model's default state.
20+
*
21+
* @return array
22+
*/
23+
public function definition()
24+
{
25+
return [
26+
'name' => fake()->name(),
27+
'number' => fake()->numberBetween(-9999999, 9999999),
28+
];
29+
}
30+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class() extends Migration {
8+
/**
9+
* Run the migrations.
10+
*
11+
* @return void
12+
*/
13+
public function up()
14+
{
15+
Schema::create('model_withs', function (Blueprint $table) {
16+
$table->id();
17+
$table->string('name');
18+
$table->bigInteger('number');
19+
$table->string('string')->nullable();
20+
$table->foreignIdFor(\Lomkit\Rest\Tests\Support\Models\BelongsToRelation::class)->nullable()->constrained();
21+
$table->timestamps();
22+
});
23+
}
24+
};
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Lomkit\Rest\Tests\Support\Http\Controllers;
4+
5+
use Lomkit\Rest\Http\Controllers\Controller;
6+
use Lomkit\Rest\Tests\Support\Rest\Resources\ModelWithResource;
7+
8+
class ModelWithController extends Controller
9+
{
10+
public static $resource = ModelWithResource::class;
11+
}

tests/Support/Models/ModelWith.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace Lomkit\Rest\Tests\Support\Models;
4+
5+
use Illuminate\Database\Eloquent\Factories\HasFactory;
6+
use Illuminate\Database\Eloquent\Model as BaseModel;
7+
use Lomkit\Rest\Tests\Support\Database\Factories\ModelFactory;
8+
9+
class ModelWith extends BaseModel
10+
{
11+
use HasFactory;
12+
13+
protected static function newFactory()
14+
{
15+
return new ModelFactory();
16+
}
17+
18+
protected $with = [
19+
'belongsToRelation',
20+
];
21+
22+
protected $fillable = [
23+
'id',
24+
];
25+
26+
public function belongsToRelation()
27+
{
28+
return $this->belongsTo(BelongsToRelation::class);
29+
}
30+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace Lomkit\Rest\Tests\Support\Rest\Resources;
4+
5+
use Lomkit\Rest\Http\Requests\RestRequest;
6+
use Lomkit\Rest\Http\Resource;
7+
use Lomkit\Rest\Relations\BelongsTo;
8+
use Lomkit\Rest\Tests\Support\Models\ModelWith;
9+
10+
class ModelWithResource extends Resource
11+
{
12+
public static $model = ModelWith::class;
13+
14+
public function fields(RestRequest $request): array
15+
{
16+
return [
17+
'id',
18+
'name',
19+
'number',
20+
'string',
21+
];
22+
}
23+
24+
public function defaultOrderBy(RestRequest $request): array
25+
{
26+
return [
27+
'id' => 'asc',
28+
];
29+
}
30+
31+
public function relations(RestRequest $request): array
32+
{
33+
return [
34+
BelongsTo::make('belongsToRelation', BelongsToResource::class),
35+
];
36+
}
37+
}

tests/Support/Routes/api.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<?php
22

33
use Illuminate\Support\Facades\Route;
4-
use Lomkit\Rest\Tests\Support\Http\Controllers\ModelController;
54

65
Route::group(['as' => 'api.', 'prefix' => 'api'], function () {
7-
\Lomkit\Rest\Facades\Rest::resource('models', ModelController::class);
6+
\Lomkit\Rest\Facades\Rest::resource('models', \Lomkit\Rest\Tests\Support\Http\Controllers\ModelController::class);
7+
\Lomkit\Rest\Facades\Rest::resource('model-withs', \Lomkit\Rest\Tests\Support\Http\Controllers\ModelWithController::class);
88

99
\Lomkit\Rest\Facades\Rest::resource('no-exposed-fields', \Lomkit\Rest\Tests\Support\Http\Controllers\NoExposedFieldsController::class);
1010
\Lomkit\Rest\Facades\Rest::resource('automatic-gating', \Lomkit\Rest\Tests\Support\Http\Controllers\AutomaticGatingController::class);

0 commit comments

Comments
 (0)