1. Go to this page and download the library: Download rawnoq/laravel-query-api 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/ */
rawnoq / laravel-query-api example snippets
use App\Models\User;
// Simple query
$users = query_api(User::class)->get();
// With sorting and pagination
$users = query_api(User::class)
->sort(['name', 'created_at'])
->paginate(20);
namespace App\QueryAPI;
use Rawnoq\QueryAPI\QueryAPIConfig;
class UserQueryAPI extends QueryAPIConfig
{
public static function fields(): array
{
return ['id', 'name', 'email', 'created_at'];
}
public static function sorts(): array
{
return ['id', 'name', 'created_at'];
}
public static function defaultSort(): string
{
return '-created_at'; // Descending by created_at
}
public static function filters(): array
{
return [
self::filter()->exact('id'),
self::filter()->partial('name'),
self::filter()->partial('email'),
];
}
public static function
use App\QueryAPI\UserQueryAPI;
// Direct static call
$users = UserQueryAPI::get();
$users = UserQueryAPI::paginate(20);
// Flexible pagination methods
$users = UserQueryAPI::getOrPaginate(); // Default: get all, use ?paginate=1 for pagination
$users = UserQueryAPI::paginateOrGet(); // Default: paginate, use ?get=1 for all
// With custom query
$users = UserQueryAPI::for(User::where('is_active', true))->get();
// Set target model or query
->for(User::class)
->for(User::where('active', true))
// Configure allowed fields
->fields(['id', 'name', 'email'])
// Configure allowed sorting
->sort(['id', 'name', 'created_at'])
->defaultSort('-created_at')
// Configure allowed filters
->filters(['name', 'email'])
// Configure allowed e, use ?get=1 for all
self::filter()->callback('has_posts', function ($query) {
$query->whereHas('posts');
})
use Rawnoq\QueryAPI\Enums\FilterOperator;
self::filter()->operator('age', FilterOperator::GREATER_THAN)
self::filter()->operator('price', FilterOperator::LESS_THAN)
self::filter()->operator('salary', FilterOperator::DYNAMIC) // Allows: >3000, <100, etc.
self::filter()->trashed()
// Exclude single value (WHERE field != value)
self::filter()->exclude('status', 'internal_status')
// Exclude multiple values (WHERE field NOT IN [...])
self::filter()->excludeIn('id', 'internal_id')
// WHERE NOT with operator
self::filter()->whereNot('status', '!=', 'internal_status')
self:::
self::
self::
self::query->latestOfMany();
})
self::
class UserQueryAPI extends QueryAPIConfig
{
/**
* Default items per page
*/
public static function defaultPerPage(): int
{
return 15; // Default: 20
}
/**
* Maximum items per page
*/
public static function maxPerPage(): int
{
return 100; // Default: 100
}
/**
* Minimum items per page
*/
public static function minPerPage(): int
{
return 1; // Default: 1
}
}
// Uses defaultPerPage() if per_page not in request
$users = UserQueryAPI::paginate();
// Reads per_page from request, applies min/max limits
$users = UserQueryAPI::paginate(); // Request: ?per_page=50
// Flexible methods
$users = UserQueryAPI::getOrPaginate(); // ?paginate=1&per_page=50
$users = UserQueryAPI::paginateOrGet(); // ?per_page=50 or ?get=1
use Rawnoq\QueryAPI\Facades\QueryAPI;
$users = QueryAPI::for(User::class)
->fields(['id', 'name'])
->sort(['name'])
->get();
class UserQueryAPI extends QueryAPIConfig
{
public static function fields(): array
{
return ['id', 'name', 'email', 'full_name']; // full_name is virtual
}
public static function virtualFields(): array
{
return ['full_name']; // Declare as virtual
}
}
// Check if a field is requested
UserQueryAPI::isFieldRequested('email', $request);
// Get all requested fields
$fields = UserQueryAPI::getRequestedFields($request);
// Check if an
use Rawnoq\QueryAPI\QueryAPI;
QueryAPI::clearModelTableCache();
// In your QueryAPIConfig
public static function filters(): array
{
return [
// Multiple filters on same field
self::filter()->exact('status'),
self::filter()->partial('name'),
// Exclusion filters
self::filter()->exclude('exclude_status', 'status'),
self::filter()->excludeIn('exclude_ids', 'id'),
// Operator filters
self::filter()->operator('age', FilterOperator::GREATER_THAN),
self::filter()->operator('price', FilterOperator::DYNAMIC), // Allows >, <, >=, <=
// Callback with complex logic
self::filter()->callback('has_recent_posts', function ($query, $value) {
if ($value) {
$query->whereHas('posts', function ($q) {
$q->where('created_at', '>', now()->subDays(7));
});
}
}),
];
}
// Make sure the field is in your fields() method
public static function fields(): array
{
return ['id', 'name', 'email']; // Add missing field here
}
// Make sure to declare it in virtualFields()
public static function virtualFields(): array
{
return ['full_name', 'value']; // Add virtual field here
}
// Check if the unction self::s requested in the Resource
'posts' => $this->when(
UserQueryAPI::isIncludeRequested('posts'),
fn() => $this->posts
)
// Make sure model() method returns correct class
public static function model(): string
{
return User::class; // Use full namespace if needed: \App\Models\User::class
}
// Use pagination and limit fields
$users = UserQueryAPI::paginate(20); // Instead of get()
// Request only needed fields
GET /api/users?fields[users]=id,name&per_page=20
// Check filter type matches your use case
// For exact match:
self::filter()->exact('status') // ?filter[status]=active
// For partial match:
self::filter()->partial('name') // ?filter[name]=john (matches "john", "johnny", etc.)
// For exclusion:
self::filter()->exclude('exclude_status', 'status') // ?filter[exclude_status]=deleted