Basic resource controller
To create a basic API resource controller using this package, create a controller that extends the Javaabu\QueryBuilder\Http\Controllers\ApiController class.
<?php
namespace App\Http\Controllers\Api;
use Javaabu\QueryBuilder\Http\Controllers\ApiController;
use App\Models\Product;
use Illuminate\Database\Eloquent\Builder;
use Spatie\QueryBuilder\AllowedFilter;
class ProductsController extends ApiController
{
/**
* Get the base query
*
* @return Builder
*/
public function getBaseQuery(): Builder
{
return Product::query();
}
/**
* Get the allowed fields
*
* @return array
*/
public function getAllowedFields(): array
{
return array_diff(\Schema::getColumnListing('products'), (new Product)->getHidden());
}
/**
* Get the allowed includes
*
* @return array
*/
public function getAllowedIncludes(): array
{
return [
'category'
];
}
/**
* Get the allowed appends
*
* @return array
*/
public function getAllowedAppends(): array
{
return [
'formatted_name' => [
'name',
'price'
],
'formatted_price'
];
}
/**
* Get the allowed sorts
*
* @return array
*/
public function getAllowedSorts(): array
{
return [
'id',
'created_at',
'updated_at',
'slug',
'name',
];
}
/**
* Get the default sort
*
* @return string
*/
public function getDefaultSort(): string
{
return '-created_at';
}
/**
* Get the allowed filters
*
* @return array
*/
public function getAllowedFilters(): array
{
return [
'id',
'slug',
'name',
AllowedFilter::scope('search'),
];
}
}
The controller will have an index and show method which you can use to define your routes in your api.php route file.
// in api.php route file
/**
* Products
*/
Route::get('products', [\App\Controllers\Api\ProductsController::class, 'index'])->name('products.index');
Route::get('products/{id}', [\App\Controllers\Api\ProductsController::class, 'show'])->name('products.show');
The following methods will have to be implemented in your controller:
getBaseQuery()
This method used to define your base query. It should return a Illuminate\Database\Eloquent\Builder instance.
This builder instance will be passed to the Javaabu\QueryBuilder\QueryBuilder\QueryBuilder::for() method.
public function getBaseQuery(): Builder
{
return Product::query();
}
getAllowedFields()
Used to define which fields that users will be allowed to request through the ?fields= query parameter.
If the user doesn't include the fields parameter, then all fields defined here will be included by default.
public function getAllowedFields(): array
{
return array_diff(\Schema::getColumnListing('products'), (new Product)->getHidden());
}
getAllowedIncludes()
Used to define which relations that users will be allowed to request through the ?include= query parameter.
If the user doesn't include the include parameter, then all relations defined here will be included by default.
To not include any relation in a request, the user should submit a blank ?include= parameter.
public function getAllowedIncludes(): array
{
return [
'category'
];
}
getAllowedAppends()
Used to define which accessor attibutes that users will be allowed to request through the ?append= query parameter.
If the user doesn't include the append parameter, then all appends defined here will be included by default.
To not include any append in a request, the user should submit a blank ?append= parameter.
Note that append fields can also be requested through the fields query parameter as well.
public function getAllowedAppends(): array
{
return [
'formatted_price'
];
}
If an append depends on other database columns, then you can specify those fields as an array.
For example, formatted_name of the product might be ':name (:price). In this case, both name and price columns are required to generate the formatted_name.
If you do not include these columns, the user will get a blank value for formatted_name if they don't specifically include name and price in the fields, when doing a request like ?fields=id,formatted_name.
public function getAllowedAppends(): array
{
return [
'formatted_name' => [
'name',
'price'
],
];
}
getAllowedSorts()
Defines which fields that the user can sort the records by using the ?sort= query param. Applies only to the index method.
To sort in descending order, users can append a - to the field name, e.g. ?sort=-created_at in the query parameter.
To sort by multiple fields, users can provide a comma-separated list, e.g. ?sort=id,-created_at
public function getAllowedSorts(): array
{
return [
'id',
'created_at',
'updated_at',
'slug',
'name',
];
}
getDefaultSort()
Defines the default sort to apply if the user doesn't provide any sort parameter.
public function getDefaultSort(): string
{
return '-created_at';
}
Return an empty string if you don't want any default sort applied.
public function getDefaultSort(): string
{
return '';
}
getAllowedFilters()
Defines the filters that users can apply using the ?filter[] query parameter.
public function getAllowedFilters(): array
{
return [
'id',
'slug',
'name',
AllowedFilter::scope('search'),
];
}