From b20569142c34fd187f961685d777a4fc04a24eaf Mon Sep 17 00:00:00 2001 From: Jon Erickson Date: Fri, 15 Aug 2025 14:22:14 -0700 Subject: [PATCH] feat(laravel): Support composite identifiers within `Link` --- src/Laravel/Eloquent/State/LinksHandler.php | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Laravel/Eloquent/State/LinksHandler.php b/src/Laravel/Eloquent/State/LinksHandler.php index 771ee4d73f..509c514ab7 100644 --- a/src/Laravel/Eloquent/State/LinksHandler.php +++ b/src/Laravel/Eloquent/State/LinksHandler.php @@ -28,6 +28,7 @@ use Illuminate\Database\Eloquent\Relations\HasOneOrMany; use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Database\Eloquent\Relations\Relation; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * @implements LinksHandlerInterface @@ -109,8 +110,22 @@ private function buildQuery(Builder $builder, Link $link, mixed $identifier): Bu if ($from = $link->getFromProperty()) { /** @var Model $relatedInstance */ $relatedInstance = $this->application->make($link->getFromClass()); - $relatedInstance->setAttribute($relatedInstance->getKeyName(), $identifier); - $relatedInstance->exists = true; + + $identifierField = $link->getIdentifiers()[0]; + + if ($identifierField !== $relatedInstance->getKeyName()) { + $relatedInstance = $relatedInstance + ->newQuery() + ->where($identifierField, $identifier) + ->first(); + } else { + $relatedInstance->setAttribute($identifierField, $identifier); + $relatedInstance->exists = true; + } + + if (!$relatedInstance) { + throw new NotFoundHttpException('Not Found'); + } /** @var Relation $relation */ $relation = $relatedInstance->{$from}();