Skip to content

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:

  • status
  • total_amount
  • created_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/orders

Check 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.