Laravel 9 livewire charts; In this tutorial, we will learn how to implement line charts, pie charts, column charts and area charts using livewire package in laravel 9 app.
So, this tutorial will guide we step by step on how to display data on line chart, area chart, bar chart , pie chart and column chart in laravel 9 app using livewire package.
Laravel 9 Livewire Charts Tutorial Example
Use the following steps to implement livewire charts using livewire package in laravel 9 apps:
- Step 1 – Install Laravel 9 App
- Step 2 – Connecting App to Database
- Step 3 – Create Model & Migration using Artisan
- Step 4 – Install Livewire Package
- Step 5 – Install Livewire Charts Package
- Step 5 – Build Livewire Component using Artisan
- Step 6 – Create Route
- Step 7 – Create View File
- Step 8 – Run Development Server
Step 1 – Install Laravel 9 App
First of all, Execute the following command to install laravel fresh app for laravel 9 livewire charts app:
composer create-project --prefer-dist laravel/laravel blog
Step 2 – Connecting App to Database
In this step, Add database credentials in the .env file. So open project root directory and find .env file. Then add database detail in .env file:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=here database name here DB_USERNAME=here database username here DB_PASSWORD=here database password here
Step 3 – Run Migration
In this step, Execute the following command to create model name Expense.php:
php artisan make:model Expense -m
Then open create_expenses_table.php and update the up() function, which is located inside database/migration directory:
public function up()
{
Schema::create('expenses', function (Blueprint $table) {
$table->id();
$table->string('description');
$table->decimal('amount');
$table->string('type');
$table->timestamps();
});
}
Now, open command prompt and execute the following command to create the table into database:
php artisan migrate
Step 4 – Install Livewire Package
In this step, Execute the following command to install the livewire package in laravel 9 app:
composer require livewire/livewire
Step 5 – Install Livewire Charts Package
In this step, execute the following command to install the livewire charts package:
composer require asantibanez/livewire-charts
Step 5: Build Livewire Component using Artisan
In this step, create the livewire components for creating a livewire charts component using the following command in laravel app. So Open cmd and execute the following command:
php artisan make:livewire LivewireCharts
This command will create the following components on the following path:
app/Http/Livewire/LivewireCharts.php resources/views/livewire/livewire-charts.blade.php
Now, Navigate to the app/Http/Livewire folder and open the LivwireCharts.php file. Then add the following code into LivwireCharts.php file:
<?php
namespace App\Http\Livewire;
use App\Models\Expense;
use Asantibanez\LivewireCharts\Models\AreaChartModel;
use Asantibanez\LivewireCharts\Models\ColumnChartModel;
use Asantibanez\LivewireCharts\Models\LineChartModel;
use Asantibanez\LivewireCharts\Models\PieChartModel;
use Livewire\Component;
class LivewireCharts extends Component
{
public $types = ['food', 'shopping', 'entertainment', 'travel', 'other'];
public $colors = [
'food' => '#f6ad55',
'shopping' => '#fc8181',
'entertainment' => '#90cdf4',
'travel' => '#66DA26',
'other' => '#cbd5e0',
];
public $firstRun = true;
protected $listeners = [
'onPointClick' => 'handleOnPointClick',
'onSliceClick' => 'handleOnSliceClick',
'onColumnClick' => 'handleOnColumnClick',
];
public function handleOnPointClick($point)
{
dd($point);
}
public function handleOnSliceClick($slice)
{
dd($slice);
}
public function handleOnColumnClick($column)
{
dd($column);
}
public function render()
{
$expenses = Expense::whereIn('type', $this->types)->get();
$columnChartModel = $expenses->groupBy('type')
->reduce(function (ColumnChartModel $columnChartModel, $data) {
$type = $data->first()->type;
$value = $data->sum('amount');
return $columnChartModel->addColumn($type, $value, $this->colors[$type]);
}, (new ColumnChartModel())
->setTitle('Expenses by Type')
->setAnimated($this->firstRun)
->withOnColumnClickEventName('onColumnClick')
);
$pieChartModel = $expenses->groupBy('type')
->reduce(function (PieChartModel $pieChartModel, $data) {
$type = $data->first()->type;
$value = $data->sum('amount');
return $pieChartModel->addSlice($type, $value, $this->colors[$type]);
}, (new PieChartModel())
->setTitle('Expenses by Type')
->setAnimated($this->firstRun)
->withOnSliceClickEvent('onSliceClick')
);
$lineChartModel = $expenses
->reduce(function (LineChartModel $lineChartModel, $data) use ($expenses) {
$index = $expenses->search($data);
$amountSum = $expenses->take($index + 1)->sum('amount');
if ($index == 6) {
$lineChartModel->addMarker(7, $amountSum);
}
if ($index == 11) {
$lineChartModel->addMarker(12, $amountSum);
}
return $lineChartModel->addPoint($index, $amountSum, ['id' => $data->id]);
}, (new LineChartModel())
->setTitle('Expenses Evolution')
->setAnimated($this->firstRun)
->withOnPointClickEvent('onPointClick')
);
$areaChartModel = $expenses
->reduce(function (AreaChartModel $areaChartModel, $data) use ($expenses) {
return $areaChartModel->addPoint($data->description, $data->amount, ['id' => $data->id]);
}, (new AreaChartModel())
->setTitle('Expenses Peaks')
->setAnimated($this->firstRun)
->setColor('#f6ad55')
->withOnPointClickEvent('onAreaPointClick')
->setXAxisVisible(false)
->setYAxisVisible(true)
);
$this->firstRun = false;
return view('livewire.livewire-charts')
->with([
'columnChartModel' => $columnChartModel,
'pieChartModel' => $pieChartModel,
'lineChartModel' => $lineChartModel,
'areaChartModel' => $areaChartModel,
]);
}
}
After that, Navigate to the resources/views/livewire folder and open the livewire-charts.blade.php file. Then add the following code into livewire-charts.blade.php.blade.php file:
<div class="container mx-auto space-y-4 p-4 sm:p-0">
<ul class="flex flex-col sm:flex-row sm:space-x-8 sm:items-center">
<li>
<input type="checkbox" value="travel" wire:model="types"/>
<span>Travel</span>
</li>
<li>
<input type="checkbox" value="shopping" wire:model="types"/>
<span>Shopping</span>
</li>
<li>
<input type="checkbox" value="food" wire:model="types"/>
<span>Food</span>
</li>
<li>
<input type="checkbox" value="entertainment" wire:model="types"/>
<span>Entertainment</span>
</li>
<li>
<input type="checkbox" value="other" wire:model="types"/>
<span>Other</span>
</li>
</ul>
<div class="flex flex-col sm:flex-row space-y-4 sm:space-y-0 sm:space-x-4">
<div class="shadow rounded p-4 border bg-white flex-1" style="height: 32rem;">
<livewire:livewire-column-chart
key="{{ $columnChartModel->reactiveKey() }}"
:column-chart-model="$columnChartModel"
/>
</div>
<div class="shadow rounded p-4 border bg-white flex-1" style="height: 32rem;">
<livewire:livewire-pie-chart
key="{{ $pieChartModel->reactiveKey() }}"
:pie-chart-model="$pieChartModel"
/>
</div>
</div>
<div class="shadow rounded p-4 border bg-white" style="height: 32rem;">
<livewire:livewire-line-chart
key="{{ $lineChartModel->reactiveKey() }}"
:line-chart-model="$lineChartModel"
/>
</div>
<div class="shadow rounded p-4 border bg-white" style="height: 32rem;">
<livewire:livewire-area-chart
key="{{ $areaChartModel->reactiveKey() }}"
:area-chart-model="$areaChartModel"
/>
</div>
</div>
Step 6: Create Route
In this step, Navigate to the routes folder and open web.php. Then add the following routes into web.php file:
Route::get('/livewire-charts', function () {
return view('home');
});
Step 7: Create View File
In this step, navigate to resources/views/ folder and create one blade view files that name home.blade.php file. Then add the following code into home.blade.php file:
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel 9 Livewire Charts</title>
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet">
<livewire:styles />
</head>
<body class="bg-gray-200 p-8">
<livewire:livewire-charts/>
<livewire:scripts />
<script src="https://cdn.jsdelivr.net/gh/alpinejs/[email protected]/dist/alpine.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
</body>
</html>
Step 8: Run Development Server
Finally, we need to execute the following PHP artisan serve command to start laravel livewire charts app:
php artisan serve
If you want to run the project diffrent port so use this below command
php artisan serve --port=8080
Now, open browser and test laravel livewire charts app:
http://localhost:8000/livewire-charts
If we want to know more about asantibanez livewire-charts, So, we can visit this url :- https://github.com/asantibanez/livewire-charts.