PHP code example of redsky-thirty / laravel-api-query-builder
1. Go to this page and download the library: Download redsky-thirty/laravel-api-query-builder library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
redsky-thirty / laravel-api-query-builder example snippets
use App\Http\Resources\UserResource;
use RedskyEnvision\ApiQueryBuilder\ApiQueryBuilder;
use RedskyEnvision\ApiQueryBuilder\Sorts\Sort;
/*
* Use auto-mode based on URI parameters
*/
$results = ApiQueryBuilder::make(User::class, $request)
->allowedRelations(['profile', 'addresses', 'posts', 'posts.comments'])
->allowedScopes(['unverified'])
->allowedFields([
'users' => ['id', 'email', 'created_at', 'profile', 'addresses', 'posts'],
'profiles' => ['*'],
'addresses' => ['*'],
'posts' => ['title', 'excerpt', 'created_at', 'comments'],
'comments' => ['username', 'message', 'created_at']
])
->alwaysFields([
'posts' => ['author_id']
])
->allowedFilters(['name', 'email', 'created_at', 'addresses.*', 'profile.firstname', 'profile.lastname', 'posts.comments.username'])
->defaultSorts([Sort::make('created_at', 'desc')])
->prepare()
->fetch();
/*
* Force "Collection"
*
* $results = ApiQueryBuilder::make(User::class, $request)
* ...
* ->get();
*
* Force "LengthAwarePaginator"
*
* $results = ApiQueryBuilder::make(User::class, $request)
* ...
* ->paginate();
*/
return UserResource::collection($results);
use App\Http\Resources\UserResource;
use App\Models\User;
use RedskyEnvision\ApiQueryBuilder\ApiQueryBuilder;
use RedskyEnvision\ApiQueryBuilder\Resources\NotFoundResource;
$user = ApiQueryBuilder::make(User::class, $request)
->allowedRelations(['profile', 'addresses', 'posts', 'posts.comments'])
->allowedFields([
'users' => ['id', 'email', 'created_at', 'profile', 'addresses', 'posts'],
'profiles' => ['*'],
'addresses' => ['*'],
'posts' => ['title', 'excerpt', 'created_at', 'comments'],
'comments' => ['username', 'message', 'created_at']
])
->alwaysFields([
'posts' => ['author_id']
])
->allowedFilters(['name', 'email', 'created_at', 'addresses.*', 'profile.firstname', 'profile.lastname', 'posts.comments.username'])
->prepare()
->query()
->where('id', $id)
->first();
return $user !== null ? UserResource::make($user) : NotFoundResource::make();
use App\Http\Resources\UserResource;
use App\Models\User;
use RedskyEnvision\ApiQueryBuilder\ApiQueryBuilder;
$user = User::with(['profile', 'addresses', 'posts', 'posts.comments'])->inRandomOrder()->first();
ApiQueryBuilder::make(User::class, $request)
->allowedRelations(['profile', 'addresses', 'posts', 'posts.comments'])
->allowedFields([
'users' => ['id', 'email', 'created_at', 'profile', 'addresses', 'posts'],
'profiles' => ['*'],
'addresses' => ['*'],
'posts' => ['title', 'excerpt', 'created_at', 'comments'],
'comments' => ['username', 'message', 'created_at']
])
->prepareWithoutQuery();
return UserResource::make($user);
->alwaysFields([
'posts' => ['author_id']
])
$results = ApiQueryBuilder::make(User::class, $request)
->allowedSorts(['id', 'email', 'created_at'])
->prepare()
->fetch();
use RedskyEnvision\ApiQueryBuilder\Sorts\Sort;
$results = ApiQueryBuilder::make(User::class, $request)
->defaultSorts([ Sort::make('created_at', 'desc') ])
->prepare()
->fetch();
User::unverified()->get();
$results = ApiQueryBuilder::make(User::class, $request)
->allowedScopes(['unverified', 'visibleOnly'])
->prepare()
->fetch();
->allowedScopes(['*'])
use Illuminate\Database\Eloquent\Builder;
$results = ApiQueryBuilder::make(User::class, $request)
->allowedRelations(['profile'])
->allowedFilters(['search'])
->customFilters([
'search' => function (Builder $builder, string $value, string $type): void {
$operator = $type === 'like' ? 'like' : '=';
$formatted = $type === 'like' ? '%'.$value.'%' : $value;
$builder->where(function (Builder $q) use ($operator, $formatted): void {
$q->where('users.email', $operator, $formatted)
->orWhereHas('profile', function (Builder $q) use ($operator, $formatted): void {
$q->whereRaw("CONCAT(firstname, ' ', lastname) $operator ?", [$formatted]);
});
});
},
])
->prepare()
->fetch();
class UserResource extends ApiResource {
protected function defaultFields(): array {
return ['id', 'email', 'profile', 'created_at', 'updated_at'];
}
protected function data(): array {
return [
'id' => $this->id,
'email' => $this->email,
'profile' => $this->whenLoaded('profile', fn () => ProfileResource::make($this->profile)),
'posts' => $this->whenLoaded('posts', fn () => PostResource::collection($this->posts)),
'created_at' => $this->created_at,
'updated_at' => $this->updated_at
];
}
}
use RedskyEnvision\ApiQueryBuilder\Contracts\ApiResourceable;
class UserData implements ApiResourceable
{
public function __construct(
public readonly int $id,
public readonly string $name,
public readonly string $email,
) {}
public function getTable(): string
{
return 'users';
}
public function getAttributes(): array
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email
];
}
}
public function getAttributes(): array
{
return $this->toArray();
}
use RedskyEnvision\ApiQueryBuilder\Resources\ApiDtoResource;
class UserResource extends ApiDtoResource
{
protected function defaultFields(): array
{
return ['id', 'name', 'email'];
}
protected function data(): array
{
return [
'id' => $this->dto()->id,
'name' => $this->dto()->name,
'email' => $this->dto()->email
];
}
}
UserResource::make($dto);
UserResource::collection($dtos);
use RedskyEnvision\ApiQueryBuilder\Resources\ApiDtoResource;
class UserResource extends ApiDtoResource
{
protected function resolveTable(): string
{
return 'users';
}
protected function resolveAttributes(): array
{
/** @var ThirdPartyUserData $dto */
$dto = $this->resource;
return $dto->toArray();
}
protected function defaultFields(): array
{
return ['id', 'name', 'email'];
}
protected function data(): array
{
/** @var ThirdPartyUserData $dto */
$dto = $this->resource;
return [
'id' => $dto->id,
'name' => $dto->name,
'email' => $dto->email,
];
}
}
protected function resolveAttributes(): array
{
/** @var ThirdPartyUserData $dto */
$dto = $this->resource;
return [
'id' => $dto->id,
'name' => $dto->name,
'email' => $dto->email,
];
}
UserResource::make($thirdPartyDto);
protected function data(): array
{
return [
'id' => $this->dto()->id,
'name' => $this->dto()->name,
];
}
/** @mixin UserData */
class UserResource extends ApiDtoResource
{
protected function data(): array
{
return [
'id' => $this->id, // IDE-friendly, no dto() call needed
'name' => $this->name,
];
}
}
use App\DTOs\UserDto;
use App\Http\Resources\UserDtoResource;
use RedskyEnvision\ApiQueryBuilder\ApiFieldResolver;
class UserController extends Controller
{
public function show(Request $request, int $id): UserDtoResource
{
$dto = new UserDto(
id: $id,
email: '[email protected] ',
name: 'John',
createdAt: now()
);
ApiFieldResolver::make($request)
->allowedFields([
'users' => ['id', 'email', 'name', 'created_at']
])
->prepare('users');
return UserDtoResource::make($dto);
}
}
ApiFieldResolver::make($request)
->allowedFields([
'users' => ['id', 'email', 'name', 'created_at']
])
->alwaysFields([
'users' => ['id']
])
->prepare('users');
ApiFieldResolver::make($request, strict: false)
->allowedFields([
'users' => ['id', 'email', 'name']
])
->prepare('users');
$resolver = ApiFieldResolver::make($request)
->allowedFields(['users' => ['id', 'email', 'name', 'created_at']])
->prepare('users');
// Returns the filtered field list, e.g. ['id', 'email']
$fields = $resolver->getRequestedFieldsFor('users');
// Returns true if 'email' is in the resolved list (or if wildcard is active)
$hasEmail = $resolver->hasRequestedField('users', 'email');
use RedskyEnvision\ApiQueryBuilder\Resources\Concerns\HasNestedWhenLoaded;
class ContactResource extends ApiResource {
use HasNestedWhenLoaded;
protected function data(): array {
return [
'id' => $this->id,
'user_id' => $this->user_id,
// Only
whenNestedLoaded(string $relation, callable $callback, mixed $default = null): mixed
bash
cd demo
composer install
php artisan migrate:fresh --seed
php artisan serve
/demo/routes/api.php
GET /api/users?scopes=unverified
GET /api/users?
fields[users]=id,email,created_at&
where[created_at]=gt:2025-05-01%2023:59:59
GET /api/users?
fields[users]=id,email,created_at&
where[created_at]=gte:2025-05-01%2000:00:00,lte:2025-05-31%2023:59:59
GET /api/users?
fields[users]=id,email,created_at&
where[created_at]=lte:2023-12-31%2023:59:59|gte:2025-01-01%2000:00:00
GET /api/users?
fields[users]=id,email&
like[email]=gmail
GET /api/users?
fields[users]=id,email&
like[email]=!gmail
GET /api/users?
fields[users]=id,email&
like[email]=gmail|yahoo
GET /api/users?
fields[users]=id,email&
like[email]=!gmail,!yahoo