Controller
In your PostController you need to add the apiQuery scope and pass the $request to it.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Models\Post;
class PostController extends Controller
{
public function index(Request $request): JsonResponse
{
$result = Post::apiQuery($request);
return response()->json(['data' => $result]);
}
}You can pass a second parameter false to the apiQuery trait it you want to return a query Builder instance instead of a collection.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Models\Post;
class PostController extends Controller
{
public function index(Request $request): JsonResponse
{
$result = Post::apiQuery($request, false)->get();
return response()->json(['data' => $result]);
}
}WARNING
This will exclude the appends from request as it needs to be applied at the collection, instead of the query builder.
You can still call apiAppend($request) once you have your query defined.
Individual Scopes
apiQuery applies fields, filter, include, sort, limit and paginate (and append when it returns the result). Each of these also has its own scope that you can call on a query, passing the $request:
| Scope | Request parameter |
|---|---|
apiFields($request) | fields |
apiFilter($request) | filter |
apiInclude($request) | include |
apiSort($request) | sort |
apiLimit($request) | limit |
apiPaginate($request) | paginate |
apiAppend($request) | append |
apiLimit limits the number of records returned (limit in the query). apiQuery already calls it, so you only need it when you build the query yourself.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Models\Post;
class PostController extends Controller
{
public function index(Request $request): JsonResponse
{
$result = Post::apiSort($request)->apiLimit($request)->get();
return response()->index($result);
}
}GET /api/posts?sort=-created_at&limit=5select * from posts order by created_at desc limit 5TIP
limit is cast to an integer. Use paginate instead when you need page numbers and totals. When both are sent, apiQuery applies limit after paginate: the page offset is kept, but limit caps the number of records of the page.
Response Macros
The vue package expects the responses to be inside a data object.
return response()->json(['data' => $result]);To help with that, you can use the Response Macros below.
response()->index($posts); //or response()->json(['data' => $posts, 200);
response()->show($posts); //or response()->json(['data' => $posts, 200);
response()->store($posts); //or response()->json(['data' => $posts, 201);
response()->update($posts); //or response()->json(['data' => $posts, 200);
response()->destroy($posts); //or response()->json(['data' => $posts, 200);Mass Assignments
If you're going to use mass assignments, you need to create its routes first. The package comes with a route macro batch helper:
Route::batch('posts', PostController::class);
Route::apiResource('posts', PostController::class);
// which is equivalent to
Route::post('posts/batch', [PostController::class, 'storeBatch']);
Route::patch('posts/batch', [PostController::class, 'updateBatch']);
Route::patch('posts/batch-destroy', [PostController::class, 'destroyBatch']);
Route::apiResource('posts', PostController::class);WARNING
Note the batch-destroy endpoint is using a PATCH request and not DELETE
And then you have to create your controller methods like this:
<?php
namespace Konnec\VueEloquentApi\Controllers;
use Konnec\VueEloquentApi\Traits\HasBatchActions;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Models\Post;
class PostController extends Controller
{
use HasBatchActions;
public function index(Request $request): JsonResponse
{
$result = Post::apiQuery($request);
return response()->index($result);
}
public function store(Request $request): JsonResponse
{
$post = Post::create($request->all());
return response()->store($post);
}
public function show(Post $post): JsonResponse
{
return response()->show($post);
}
public function update(Request $request, Post $post): JsonResponse
{
$post->fill($request->all())->save();
return response()->update($post);
}
public function destroy(Post $post): array
{
$post->delete();
return response()->destroy($post);
}
}