Build Your First Data Source
After this page, you can define a clean source with safe fields, operators, and aggregates for frontend report builders.
What you are building
A data source called orders that exposes only trusted fields:
statustotal_amountcreated_at
Step 1: Create a source class
You can keep this as an app class and register it during boot.
php
<?php
namespace App\Reporting;
use App\Models\Order;
use Ihasan\ReportBuilder\DataSources\EloquentDataSource;
use Ihasan\ReportBuilder\Enums\AggregateFunction;
use Ihasan\ReportBuilder\Enums\FilterOperator;
use Ihasan\ReportBuilder\Support\Field;
class OrdersDataSource extends EloquentDataSource
{
public function __construct()
{
parent::__construct(
key: 'orders',
label: 'Orders',
model: Order::class,
fields: [
Field::string('status')
->label('Status')
->column('orders.status')
->filterable([FilterOperator::Eq, FilterOperator::In]),
Field::decimal('total_amount')
->label('Total Amount')
->column('orders.total_amount')
->sortable()
->groupable()
->filterable([FilterOperator::Eq, FilterOperator::Gt, FilterOperator::Between])
->aggregates([AggregateFunction::Sum, AggregateFunction::Avg]),
Field::dateTime('created_at')
->label('Created At')
->column('orders.created_at')
->sortable()
->filterable([FilterOperator::Eq, FilterOperator::Gte, FilterOperator::Lte]),
],
);
}
}Step 2: Register the class
php
$reportBuilder->registerDataSource(new OrdersDataSource());Verify
Call:
bash
curl http://your-app.test/report-builder/sources/ordersCheck that only intended fields and options appear.
Common mistakes
- Duplicate field keys in one source.
- Missing
column()mapping for renamed keys. - Making all fields groupable/filterable without reason.
Next
Continue with Use Metadata API in UI.