From 48c63de053f7e8302562f346a10481333e956981 Mon Sep 17 00:00:00 2001 From: Sami Mazouz Date: Wed, 28 Feb 2024 12:01:17 +0100 Subject: [PATCH 1/2] feat: allow limiting `ToMany` relationships --- src/Laravel/EloquentBuffer.php | 11 ++++++++++- src/Schema/Field/ToMany.php | 9 +++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/Laravel/EloquentBuffer.php b/src/Laravel/EloquentBuffer.php index 08df728..2a0ed10 100644 --- a/src/Laravel/EloquentBuffer.php +++ b/src/Laravel/EloquentBuffer.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Relations\MorphTo; use Tobyz\JsonApiServer\Context; use Tobyz\JsonApiServer\Schema\Field\Relationship; +use Tobyz\JsonApiServer\Schema\Field\ToMany; abstract class EloquentBuffer { @@ -56,7 +57,15 @@ public static function load( $modelClass = get_class($resource->newModel($context)); if ($resource instanceof EloquentResource && !isset($constrain[$modelClass])) { - $constrain[$modelClass] = fn($query) => $resource->scope($query, $context); + $constrain[$modelClass] = function ($query) use ($resource, $context, $relationship, $relation) { + $resource->scope($query, $context); + + // Limiting relationship results is only possible on Laravel 11 or later, + // or if the model uses the \Staudenmeir\EloquentEagerLimit\HasEagerLimit trait. + if ($relationship instanceof ToMany && method_exists($relation, 'limit') && ! empty($relationship->limit)) { + $relation->limit($relationship->limit); + } + }; } } diff --git a/src/Schema/Field/ToMany.php b/src/Schema/Field/ToMany.php index 04d3405..dd85ef5 100644 --- a/src/Schema/Field/ToMany.php +++ b/src/Schema/Field/ToMany.php @@ -8,6 +8,8 @@ class ToMany extends Relationship { + public ?int $limit = null; + public function __construct(string $name) { parent::__construct($name); @@ -15,6 +17,13 @@ public function __construct(string $name) $this->type($name); } + public function limit(?int $limit): static + { + $this->limit = $limit; + + return $this; + } + public function serializeValue($value, Context $context): mixed { $meta = $this->serializeMeta($context); From 1d93d1779c0e2f2472baf2e179aaade5c98d47fc Mon Sep 17 00:00:00 2001 From: SychO9 Date: Wed, 28 Feb 2024 11:01:59 +0000 Subject: [PATCH 2/2] Run Prettier --- src/Laravel/EloquentBuffer.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Laravel/EloquentBuffer.php b/src/Laravel/EloquentBuffer.php index 2a0ed10..52ceffd 100644 --- a/src/Laravel/EloquentBuffer.php +++ b/src/Laravel/EloquentBuffer.php @@ -57,12 +57,21 @@ public static function load( $modelClass = get_class($resource->newModel($context)); if ($resource instanceof EloquentResource && !isset($constrain[$modelClass])) { - $constrain[$modelClass] = function ($query) use ($resource, $context, $relationship, $relation) { + $constrain[$modelClass] = function ($query) use ( + $resource, + $context, + $relationship, + $relation, + ) { $resource->scope($query, $context); // Limiting relationship results is only possible on Laravel 11 or later, // or if the model uses the \Staudenmeir\EloquentEagerLimit\HasEagerLimit trait. - if ($relationship instanceof ToMany && method_exists($relation, 'limit') && ! empty($relationship->limit)) { + if ( + $relationship instanceof ToMany && + method_exists($relation, 'limit') && + !empty($relationship->limit) + ) { $relation->limit($relationship->limit); } };