Skip to main content

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'),
];
}