Skip to content

Instantly share code, notes, and snippets.

@tonysm
Last active April 10, 2019 14:45
Show Gist options
  • Save tonysm/e97601ab3294b64c0fc8429c70dda398 to your computer and use it in GitHub Desktop.
Save tonysm/e97601ab3294b64c0fc8429c70dda398 to your computer and use it in GitHub Desktop.
API resource eager loading, simplified
<?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());
}
}
<?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