图表布局可以使用 orchid:chart Artisan 命令生成。默认情况下,所有新的度量将放置在 app/Orchid/Layouts 目录中:

php artisan orchid:chart ChartsLayout

一旦您的图表类生成完毕,您就可以开始自定义它了。示例:

namespace App\Orchid\Layouts;

use Orchid\Screen\Layouts\Chart;

class ChartsLayout extends Chart
{
    /**
     * 可用选项:
     * 'bar', 'line', 
     * 'pie', 'percentage'
     *
     * @var string
     */
    protected $type = 'bar';
}

通过创建和设置类的可视化表示,我们可以在未来使用它。但在使用图表之前,我们需要准备我们想要显示的数据。为此,让我们设置屏幕的 query 值:

public function query() : array
{
    $dataset = [
        [
            'labels' => ['12am-3am', '3am-6am', '6am-9am', '9am-12pm', '12pm-3pm', '3pm-6pm', '6pm-9pm'],
            'name'  => '一些数据',
            'values' => [25, 40, 30, 35, 8, 52, 17, -4],
        ],
        [
            'labels' => ['12am-3am', '3am-6am', '6am-9am', '9am-12pm', '12pm-3pm', '3pm-6pm', '6pm-9pm'],
            'name'  => '另一组数据',
            'values' => [25, 50, -10, 15, 18, 32, 27, 14],
        ],
        [
            'labels' => ['12am-3am', '3am-6am', '6am-9am', '9am-12pm', '12pm-3pm', '3pm-6pm', '6pm-9pm'],
            'name'  => '再一组数据',
            'values' => [15, 20, -3, -15, 58, 12, -17, 37],
        ],
    ];
    
    return [
        'dataset' => $dataset,
    ];
}

现在我们可以通过调用静态方法 make 并指定数据的目标键来使用布局类:

use App\Orchid\Layouts\ChartsLayout;

public function layout(): iterable
{
    return [
        ChartsLayout::make('dataset', '我们数据集的标题'),
    ];
}

通常数据集需要一些解释,我们可以为此添加描述:

use App\Orchid\Layouts\ChartsLayout;

public function layout(): iterable
{
    return [
        ChartsLayout::make('dataset', '我们数据集的标题')
            ->description('图表的描述')
    ];
}

基本配置

配置用于改变图表的行为。这里有一些属性可以控制样式、高度等。

调整高度

通过指定属性来设置图表的高度(以像素为单位):

/**
 * @var int
 */
protected $height = 250;

自定义颜色

根据图表类型,通过指定属性来设置每个单独单元类型使用的颜色:

/**
 * 使用的颜色。
 *
 * @var array
 */
protected $colors = [
    '#2274A5',
    '#F75C03',
    '#F1C40F',
    '#D90368',
    '#00CC66',
];

导出图片

图表可以以 SVG 格式导出,这是它们初始显示的格式。为此,指定属性:

/**
 * 决定是否显示导出按钮。
 *
 * @var bool
 */
protected $export = true;

添加标记

有些图表在没有更多信息的情况下很难解读。例如,显示平均值。为此,您可以定义 markers 方法:

/**
 * 为了在 Y 轴上突出显示某些值,可以设置标记。
 * 它们将在图表上显示为虚线。
 */
protected function markers(): ?array
{
    return [
        [
            'label'   => '中等',
            'value'   => 40,
        ],
    ];
}

Eloquent 模型

为了使用模型获取图表数据的方法,您需要添加 Chartable trait:

namespace App;

use Orchid\Metrics\Chartable;
use Orchid\Platform\Models\User as Authenticatable;

class User extends Authenticatable
{
    use Chartable;
    // ...
}

这将为图表添加几个新方法:

  • 分组数据
  • 时间段

分组数据

例如,您可能希望构建一个图表来显示启用了双因素认证的用户比例。

namespace App\Orchid\Layouts;

use Orchid\Screen\Layouts\Chart;

class BasicPieChart extends Chart
{
    /**
     * 可用选项:
     * 'bar', 'line',
     * 'pie', 'percentage'.
     *
     * @var string
     */
    protected $type = 'pie';
}

然后模型查询将作为数据源 countForGroup()

public function query(): array
{
    $userUsageTwoFactorAuth = User::countForGroup('uses_two_factor_auth')->toChart();

    return [
        'userUsageTwoFactorAuth' => $userUsageTwoFactorAuth,
    ];
}

public function layout(): array
{
    return [
        BasicPieChart::make('userUsageTwoFactorAuth', '使用双因素认证'),
    ];
}

为了更改标题文本,您可以将闭包函数作为第一个参数传递:

User::countForGroup('uses_two_factor_auth')
    ->toChart(fn(bool $value) => $value ? '已启用' : '未启用'),

使用时间段

接收特定时间段的数据,填充缺失值。

例如,让我们显示新用户和角色的图表:

namespace App\Orchid\Layouts;

use Orchid\Screen\Layouts\Chart;

class BasicLineChart extends Chart
{   
    /**
     * 可用选项:
     * 'bar', 'line',
     * 'pie', 'percentage'.
     *
     * @var string
     */
    protected $type = 'line';
}

然后数据源将是:

public function query(): array
{
    return [
        'members' => [
            User::countByDays()->toChart('用户'),
            Role::countByDays()->toChart('角色'),
        ]
    ];
}

public function layout(): array
{
    return [
        BasicLineChart::make('members', '新成员'),
    ];
}

默认情况下,数据将被获取一个月;要设置自己的时间段,您需要传递参数:

$start = Carbon::now()->subDay(7);
$end = Carbon::now()->subDay(1);

User::countByDays($start, $end)->toChart('用户')

默认情况下,数据按 created_at 列分组,要更改它:

$start = Carbon::now()->subDay(7);
$end = Carbon::now()->subDay(1);

User::countByDays($start, $end, 'updated_at')->toChart('用户')

值查询类型

值度量不仅仅提供 countByDays 方法。您还可以在构建度量时使用各种其他聚合函数。

average 方法可以用于计算给定列的平均值:

Order::averageByDays('price')->toChart('订单'),

sum 方法可以用于计算给定列的总和:

Order::sumByDays('price')->toChart('订单'),

min 方法可以用于计算给定列的最小值:

Order::minByDays('price')->toChart('订单'),

max 方法可以用于计算给定列的最大值:

Order::maxByDays('price')->toChart('订单'),

我们的朋友