Mohmad-Zarifiyan/laravel-chart

一款Laravel包,帮助您快速从数据库中创建图表。

3.0.0 2024-04-15 18:34 UTC

This package is auto-updated.

Last update: 2024-09-23 20:23:14 UTC


README

该Laravel包可以帮助您轻松使用Eloquent ORM导出用于图表的数据。

安装

要安装包,只需在项目根目录下运行以下命令

composer require mohammad-zarifiyan/laravel-chart:^3.0

实现

首先,您需要将特性 MohammadZarifiyan\LaravelChart\Traits\HasChart 应用到您的模型上。然后使用 exportForChart 方法来提取数据。

  1. 该方法的第一参数必须是 Carbon\CarbonPeriod 的一个实例,它指定了整个时间段的开始和结束。
  2. 该方法的第二参数必须是一个闭包,其第一个参数是 Illuminate\Database\Eloquent\Builder 的一个实例,第二个参数是 Carbon\CarbonPeriod 的一个实例。在这个闭包中,您必须对 Illuminate\Database\Eloquent\Builder 应用条件,以限制数据到 Carbon\CarbonPeriod 提供的时间段,然后返回图表所需的数据。

exportForChart 方法的返回值是一个包含您在闭包中返回的数据的 Illuminate\Support\Collection 实例,因此您可以在图表中使用这些数据。

示例

在以下示例中,我们计算了一个星期前到现在的每一天发票的 amount 列的总和。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use MohammadZarifiyan\LaravelChart\Traits\HasChart;

class Invoice extends Model
{
    use HasChart;

    protected $fillable = [
        'amount',
    ];

    protected $casts = [
        'amount' => 'integer',
    ];

    public function payment()
        return $this->belongsTo(Payment::class);
    }
}
<?php

use App\Models\Invoice;
use Carbon\CarbonInterval;
use Carbon\CarbonPeriod;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Builder;

$start = Carbon::now()->subDays(6)->startOfDay();
$end = Carbon::now();
$interval = CarbonInterval::day();
$period = CarbonPeriod::start($start)->setEndDate($end)->setDateInterval($interval);

$output = Invoice::exportForChart($period, function (Builder $builder, CarbonPeriod $period) {
    $builder->whereBetween('created_at', $period);
    
    return $builder->sum('amount');
});

上述代码的输出将类似于

[
    2,  // Sum amount, 6 days ago (all day)
    50, // Sum amount, 5 days ago (all day)
    49, // Sum amount, 4 days ago (all day)
    85, // Sum amount, 3 days ago (all day)
    140,// Sum amount, 2 days ago (all day)
    110,// Sum amount, 1 days ago (all day)
    80, // Sum amount, today (till now)
]

您还可以根据关联中的列过滤表格数据。在下面的示例中,我们根据他们的 payment time 获取发票金额的总和。

<?php

use App\Models\Invoice;
use Carbon\CarbonInterval;
use Carbon\CarbonPeriod;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Builder;

$start = Carbon::now()->subDays(6)->startOfDay();
$end = Carbon::now();
$interval = CarbonInterval::day();
$period = CarbonPeriod::start($start)->setEndDate($end)->setDateInterval($interval);
    
$output_for_chart = Invoice::exportForChart($period, function (Builder $builder, CarbonPeriod $period) {
    $builder->whereRelation('payment', fn (Builder $builder) => $builder->whereBetween('paid_at', $period));
    
    return $builder->sum('amount');
});