Skip to content

Response using Transformer

[!NOTE] You'll need to install laravel-datatables-fractal package if you haven't already.

When using transformers, all response manipulations must be done via transformer. Thus addColumn, editColumn, removeColumn, setRowAttr, setClassAttr, etc. should be avoided when using Fractal.


Using Closure

You can pass a closure which will receive an item of the result collection and should return an array:

use Yajra\DataTables\Facades\DataTables;
use App\Models\User;
 
Route::get('user-data', function () {
$model = User::query();
 
return DataTables::eloquent($model)
->setTransformer(function (User $item) {
return [
'id' => (int) $item->id,
'name' => $item->name,
'email' => $item->email,
'created_at' => (string) $item->created_at,
'updated_at' => (string) $item->updated_at,
];
})
->toJson();
});

Thus you can make use of Laravel API Resource:

use Yajra\DataTables\Facades\DataTables;
use App\Models\User;
use App\Http\Resources\UserResource;
 
Route::get('user-data', function () {
$model = User::query();
 
return DataTables::eloquent($model)
->setTransformer(function (User $item) {
return UserResource::make($item)->resolve();
})
->toJson();
});

Using Transformer Class

You can use a Transformer class:

use Yajra\DataTables\Facades\DataTables;
use App\Transformers\UserTransformer;
 
Route::get('user-data', function () {
$model = App\Models\User::query();
 
return DataTables::eloquent($model)
->setTransformer(new UserTransformer)
->toJson();
});

Creating a Transformer

Create a transformer class:

<?php
// app/Transformers/UserTransformer.php
 
namespace App\Transformers;
 
use App\Models\User;
use League\Fractal\TransformerAbstract;
 
class UserTransformer extends TransformerAbstract
{
protected $availableIncludes = ['posts'];
 
public function transform(User $user): array
{
return [
'id' => (int) $user->id,
'name' => $user->name,
'email' => $user->email,
'created_at' => (string) $user->created_at,
'updated_at' => (string) $user->updated_at,
];
}
 
public function includePosts(User $user)
{
$posts = $user->posts;
 
return $this->collection($posts, new PostTransformer);
}
}

Using Artisan Command

You can use make:transformer command to generate boilerplate:

php artisan make:transformer User
<?php
// app/Transformers/UserTransformer.php
 
namespace App\Transformers;
 
use League\Fractal\TransformerAbstract;
use App\Models\User;
 
class UserTransformer extends TransformerAbstract
{
public function transform(User $user): array
{
return [
'id' => (int) $user->id,
];
}
}

Or even with included class:

php artisan make:transformer User Post
<?php
// app/Transformers/UserTransformer.php
 
namespace App\Transformers;
 
use League\Fractal\TransformerAbstract;
use App\Models\User;
use App\Models\Post;
 
class UserTransformer extends TransformerAbstract
{
protected $availableIncludes = ['post'];
 
public function transform(User $user): array
{
return [
'id' => (int) $user->id,
];
}
 
public function includePost(User $user)
{
return $this->collection($user->post, new PostTransformer);
}
}

See Also