Last active
April 10, 2019 14:45
-
-
Save tonysm/e97601ab3294b64c0fc8429c70dda398 to your computer and use it in GitHub Desktop.
API resource eager loading, simplified
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class OrganisationUserGroupsController | |
{ | |
public function index(ListOrganisationUserGroupsRequest $request, Organisation $organisation) | |
{ | |
$userGroups = $organisation->userGroups() | |
->applyFilters($request->filters()) | |
->paginate(); | |
return UserGroupCollection::make($userGroups) | |
->includeUsersIf($request->shouldInclude('users')); | |
} | |
} | |
class UserGroupCollection extends JsonResource | |
{ | |
public function toArray($request) | |
{ | |
return parent::toArray($request); | |
} | |
public function includeUsersIf(bool $shouldInclude) | |
{ | |
if (! $shouldInclude) { | |
return $this; | |
} | |
return $this->additional([ | |
'included' => [ | |
'users' => $this->userGroups() | |
->load('users') | |
->mapWithKeys(function (UserGroup $userGroup) { | |
return [ $userGroup->getKey() => UserCollection::make($userGroup->users)]; | |
}); | |
], | |
]); | |
} | |
private function userGroups(): Collection | |
{ | |
return Collection::wrap($this->collection->map->resource->all()); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class OrganisationUserGroupsController | |
{ | |
public function index(ListOrganisationUserGroupsRequest $request, Organisation $organisation) | |
{ | |
$userGroups = $organisation->userGroups() | |
->applyFilters($request->filters()) | |
->with($request->includes()) | |
->paginate(); | |
return UserGroupCollection::make($userGroups) | |
->includeUsersIf($request->shouldInclude('users')); | |
} | |
} | |
class UserGroupCollection extends JsonResource | |
{ | |
public function toArray($request) | |
{ | |
return parent::toArray($request); | |
} | |
public function includeUsersIf(bool $shouldInclude) | |
{ | |
if (! $shouldInclude) { | |
return $this; | |
} | |
return $this->additional([ | |
'included' => [ | |
'users' => $this->collection | |
->map->resource | |
->mapWithKeys(function (UserGroup $userGroup) { | |
return [ $userGroup->getKey() => UserCollection::make($userGroup->users)]; | |
}); | |
], | |
]); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment