Skip to content

Commit 0c231b6

Browse files
authored
Merge pull request #7 from Lomkit/feature/through-relationships
✨ HasOneThrough + HasManyThrough relation support
2 parents 3acfed7 + 9a33c6c commit 0c231b6

21 files changed

+707
-16
lines changed

src/Http/Requests/MutateRequest.php

+6-8
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Lomkit\Rest\Relations\BelongsTo;
1313
use Lomkit\Rest\Relations\BelongsToMany;
1414
use Lomkit\Rest\Relations\HasMany;
15+
use Lomkit\Rest\Relations\HasManyThrough;
1516
use Lomkit\Rest\Rules\CustomRulable;
1617
use Lomkit\Rest\Rules\Includable;
1718
use Lomkit\Rest\Rules\RequiredRelation;
@@ -69,18 +70,15 @@ protected function relationRules(Resource $resource, string $prefix = '', $loade
6970
) {
7071
$prefixRelation = $prefix.'.'.$relation->relation;
7172

72-
if ($relation instanceof BelongsToMany || $relation instanceof HasMany) {
73+
if ($relation instanceof BelongsToMany || $relation instanceof HasMany || $relation instanceof HasManyThrough) {
7374
$prefixRelation .= '.*';
7475
}
7576

76-
$rules = array_merge(
77+
$rules = array_merge_recursive(
7778
$rules,
78-
$relation->isRequiredOnCreation(
79-
app()->make(RestRequest::class),
80-
$relation->resource()
81-
) ? [
82-
$prefix => RequiredRelation::make()->resource($resource)
83-
] : [],
79+
[
80+
$prefix.'.'.$relation->relation => $relation->rules($resource)
81+
],
8482
$this->mutateRules($relation->resource(), $prefixRelation, array_merge($loadedRelations, [$relation->relation]))
8583
);
8684
}

src/Relations/HasManyThrough.php

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace Lomkit\Rest\Relations;
4+
5+
use Closure;
6+
use Illuminate\Database\Eloquent\Builder;
7+
use Illuminate\Database\Eloquent\Model;
8+
use Lomkit\Rest\Contracts\QueryBuilder;
9+
use Lomkit\Rest\Contracts\RelationResource;
10+
use Lomkit\Rest\Http\Resource;
11+
12+
class HasManyThrough extends Relation implements RelationResource
13+
{
14+
public function afterMutating(Model $model, Relation $relation, array $mutationRelations)
15+
{
16+
throw new \RuntimeException('You can\'t mutate a \'HasManyThrough\' relation.');
17+
}
18+
19+
public function rules(Resource $resource)
20+
{
21+
return [
22+
'prohibited'
23+
];
24+
}
25+
}

src/Relations/HasOneThrough.php

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace Lomkit\Rest\Relations;
4+
5+
use Closure;
6+
use Illuminate\Database\Eloquent\Builder;
7+
use Illuminate\Database\Eloquent\Model;
8+
use Lomkit\Rest\Contracts\QueryBuilder;
9+
use Lomkit\Rest\Contracts\RelationResource;
10+
use Lomkit\Rest\Http\Resource;
11+
12+
class HasOneThrough extends Relation implements RelationResource
13+
{
14+
public function afterMutating(Model $model, Relation $relation, array $mutationRelations)
15+
{
16+
throw new \RuntimeException('You can\'t mutate a \'HasOneThrough\' relation.');
17+
}
18+
19+
public function rules(Resource $resource)
20+
{
21+
return [
22+
'prohibited'
23+
];
24+
}
25+
}

src/Relations/Relation.php

+13
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Lomkit\Rest\Http\Resource;
1212
use Lomkit\Rest\Relations\Traits\Constrained;
1313
use Lomkit\Rest\Relations\Traits\Mutates;
14+
use Lomkit\Rest\Rules\RequiredRelation;
1415

1516
class Relation
1617
{
@@ -60,4 +61,16 @@ public function fromResource(Resource $fromResource) {
6061
$this->fromResource = $fromResource;
6162
});
6263
}
64+
65+
public function rules(Resource $resource) {
66+
$rules = [];
67+
68+
if ($this->isRequiredOnCreation(
69+
app()->make(RestRequest::class)
70+
)) {
71+
$rules[] = RequiredRelation::make()->resource($resource);
72+
}
73+
74+
return $rules;
75+
}
6376
}

0 commit comments

Comments
 (0)