Como criar gráficos da dados reais do banco de dados com Laravel

Para criar gráficos com dados reais do banco de dados no Laravel, você pode usar bibliotecas de gráficos modernas como Chart.js, Highcharts, ou ApexCharts. Essas bibliotecas podem ser integradas ao Laravel para gerar gráficos dinâmicos baseados nos dados recuperados do banco.

Aqui está um passo a passo detalhado para criar gráficos com Chart.js usando dados reais do banco de dados no Laravel.


1. Configurar o Banco de Dados

Certifique-se de que você tem uma tabela com os dados que deseja visualizar em gráficos. Por exemplo, suponha que você tenha uma tabela de vendas (sales) com a seguinte estrutura:

Estrutura da tabela sales

CREATE TABLE sales (
    id INT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(255) NOT NULL,
    quantity_sold INT NOT NULL,
    sale_date DATE NOT NULL,
    created_at TIMESTAMP NULL,
    updated_at TIMESTAMP NULL
);

Exemplo de dados na tabela:

ID Product Name Quantity Sold Sale Date
1 Produto A 50 2024-12-01
2 Produto B 20 2024-12-02
3 Produto C 30 2024-12-03

2. Criar um Controlador

Crie um controlador para buscar os dados do banco:

php artisan make:controller ChartController

No arquivo app/Http/Controllers/ChartController.php, adicione o seguinte código para buscar os dados:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class ChartController extends Controller
{
    public function index()
    {
        // Buscar os dados do banco de dados (exemplo: vendas por produto)
        $sales = DB::table('sales')
            ->select('product_name', DB::raw('SUM(quantity_sold) as total_sales'))
            ->groupBy('product_name')
            ->get();

        // Passar os dados para a view
        return view('charts.index', compact('sales'));
    }
}

Aqui estamos agrupando os dados de vendas por produto (GROUP BY product_name) e somando as quantidades vendidas (SUM(quantity_sold)).


3. Criar uma Rota

Adicione uma rota no arquivo routes/web.php para acessar o gráfico:

use App\Http\Controllers\ChartController;

Route::get('/charts', [ChartController::class, 'index']);

4. Criar a View

Crie a view resources/views/charts/index.blade.php para exibir o gráfico usando Chart.js.

Código da View:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Gráfico de Vendas</title>
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
    <h1>Gráfico de Vendas</h1>
    <canvas id="salesChart" width="400" height="200"></canvas>

    <script>
        // Dados passados do Laravel para o JavaScript
        const labels = @json($sales->pluck('product_name')); // Nomes dos produtos
        const data = @json($sales->pluck('total_sales')); // Total de vendas

        // Configuração do gráfico
        const ctx = document.getElementById('salesChart').getContext('2d');
        const salesChart = new Chart(ctx, {
            type: 'bar', // Tipo do gráfico: barras
            data: {
                labels: labels, // Rótulos (nomes dos produtos)
                datasets: [{
                    label: 'Vendas por Produto',
                    data: data, // Dados (quantidade de vendas)
                    backgroundColor: [
                        'rgba(255, 99, 132, 0.2)',
                        'rgba(54, 162, 235, 0.2)',
                        'rgba(255, 206, 86, 0.2)',
                        'rgba(75, 192, 192, 0.2)',
                        'rgba(153, 102, 255, 0.2)',
                        'rgba(255, 159, 64, 0.2)'
                    ],
                    borderColor: [
                        'rgba(255, 99, 132, 1)',
                        'rgba(54, 162, 235, 1)',
                        'rgba(255, 206, 86, 1)',
                        'rgba(75, 192, 192, 1)',
                        'rgba(153, 102, 255, 1)',
                        'rgba(255, 159, 64, 1)'
                    ],
                    borderWidth: 1
                }]
            },
            options: {
                scales: {
                    y: {
                        beginAtZero: true // Começar no zero
                    }
                }
            }
        });
    </script>
</body>
</html>

Explicação:

  1. Script Chart.js: Incluímos o script do Chart.js via CDN.
  2. Laravel para JavaScript:
    • Usamos @json($sales->pluck('product_name')) para passar os nomes dos produtos.
    • Usamos @json($sales->pluck('total_sales')) para passar o total de vendas.
  3. Gráfico de Barras: Configuramos um gráfico de barras que usa os nomes dos produtos como rótulos e o total de vendas como valores.

5. Testar o Gráfico

Inicie o servidor do Laravel:

php artisan serve

Acesse a URL:

http://localhost:8000/charts

Você verá o gráfico de vendas exibindo os dados do banco.


6. Melhorias e Personalizações

6.1. Outros Tipos de Gráficos

O Chart.js suporta vários tipos de gráficos, como:

  • Linha (line)
  • Pizza (pie)
  • Radar (radar)
  • Área (polarArea)

Para mudar o tipo, basta alterar a propriedade type:

type: 'pie', // Exemplo de gráfico de pizza

6.2. Filtrar Dados

Você pode adicionar filtros para o gráfico, como selecionar um intervalo de datas. Edite o controlador para receber parâmetros de filtro:

public function index(Request $request)
{
    $startDate = $request->input('start_date', '2024-01-01');
    $endDate = $request->input('end_date', now());

    $sales = DB::table('sales')
        ->select('product_name', DB::raw('SUM(quantity_sold) as total_sales'))
        ->whereBetween('sale_date', [$startDate, $endDate])
        ->groupBy('product_name')
        ->get();

    return view('charts.index', compact('sales', 'startDate', 'endDate'));
}

No formulário da view:

<form method="GET" action="/charts">
    <label for="start_date">Data Inicial:</label>
    <input type="date" name="start_date" value="{{ $startDate }}">
    <label for="end_date">Data Final:</label>
    <input type="date" name="end_date" value="{{ $endDate }}">
    <button type="submit">Filtrar</button>
</form>

6.3. Carregar Dados via AJAX

Para gráficos dinâmicos, você pode carregar dados do backend usando AJAX:

fetch('/api/sales-data')
    .then(response => response.json())
    .then(data => {
        // Atualizar o gráfico com novos dados
        salesChart.data.labels = data.labels;
        salesChart.data.datasets[0].data = data.values;
        salesChart.update();
    });

No Laravel, crie uma rota para retornar os dados em JSON:

Route::get('/api/sales-data', function () {
    $sales = DB::table('sales')
        ->select('product_name', DB::raw('SUM(quantity_sold) as total_sales'))
        ->groupBy('product_name')
        ->get();

    return response()->json([
        'labels' => $sales->pluck('product_name'),
        'values' => $sales->pluck('total_sales'),
    ]);
});

Com isso, você pode criar gráficos dinâmicos e interativos no Laravel! Se precisar de mais ajuda ou personalizações, é só pedir.

Posts Similares