abordage/eloquent-percentile

Laravel Eloquent 中带有 Median(), Percentile(), median() 和 percentile() 聚合函数

1.0.1 2024-03-23 19:00 UTC

README

该包提供了几个聚合函数,其工作方式与 withAvg(), withMax() 相同

Eloquent withMedian, withPercentile

Packagist Version Coverage Status GitHub Tests Status GitHub Code Style Status PHP Version Support License

要求

  • PHP 7.4 - 8.3
  • Laravel 8.x - 11.x

支持

  • PostgreSQL

安装

您可以通过 composer 安装此包

composer require abordage/eloquent-percentile

用法

聚合相关模型

withMedian() 方法将在您的结果模型上放置一个 {relation}_median_{column} 属性

use App\Models\Post;
 
$posts = Post::withMedian('comments', 'votes')->get();
 
foreach ($posts as $post) {
    echo $post->comments_median_votes;
}

withPercentile() 方法将在您的结果模型上放置一个 {relation}_percentile{percentile*100}_{column} 属性

use App\Models\Post;
 
$posts = Post::withPercentile('comments', 'votes', 0.85)->get();
 
foreach ($posts as $post) {
    echo $post->comments_percentile85_votes;
}

检索聚合数据

在与 Eloquent 模型交互时,您还可以使用 percentilemedian 聚合方法。正如您所期望的,这些方法返回一个标量值,而不是 Eloquent 模型实例

$median = Comment::where('active', 1)->median('votes');
 
$percentile95 = Comment::where('active', 1)->percentile('votes', 0.95);

模型自动 PHPDocs

如果您正在使用 ide-helper,您可以使用 模型钩子 描述属性。例如

<?php

namespace App\Support\IdeHelper;

use App\Models\Post;
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
use Barryvdh\LaravelIdeHelper\Contracts\ModelHookInterface;
use Illuminate\Database\Eloquent\Model;

class PostHook implements ModelHookInterface
{
    public function run(ModelsCommand $command, Model $model): void
    {
        if (!$model instanceof Post) {
            return;
        }

        $command->setProperty('comments_median_votes', 'float|null', true, false);
        $command->setProperty('comments_percentile80_votes', 'float|null', true, false);
        $command->setProperty('comments_percentile95_votes', 'float|null', true, false);
    }
}

测试

在运行测试之前,将 phpunit.xml.dist 重命名为 phpunit.xml 并指定您的数据库连接设置

<php>
    <env name="DB_CONNECTION_POSTGRES" value="pgsql"/>
    <env name="DB_HOST_POSTGRES" value="postgres"/>
    <env name="DB_PORT_POSTGRES" value="5432"/>
    <env name="DB_DATABASE_POSTGRES" value="eloquent_percentile_test"/>
    <env name="DB_USERNAME_POSTGRES" value="default"/>
    <env name="DB_PASSWORD_POSTGRES" value="secret"/>
</php>

然后运行

composer test:all

composer test:phpunit
composer test:phpstan
composer test:phpcsf

变更日志

请参阅CHANGELOG 以获取有关最近更改的更多信息。

贡献

请参阅CONTRIBUTING 以获取详细信息。

安全

请审查我们的安全策略 以了解如何报告安全漏洞。

反馈

发现错误或有功能请求? 打开一个问题,或者更好的是,提交一个拉取请求 - 欢迎贡献!

致谢

感谢

原始想法来自 tailslide-php,所以非常感谢其作者!

许可证

MIT 许可证 (MIT)。请参阅许可证文件 以获取更多信息。