ge-tracker/laravel-redis-paginator

从Redis有序集合创建Laravel分页器或LengthAwarePaginator

v2.0.1 2023-03-06 11:53 UTC

This package is auto-updated.

Last update: 2024-09-06 20:21:26 UTC


README

Latest Version on Packagist GitHub Tests Action Status Total Downloads

是否希望在大规模上显示分页的有序集合?这将是游戏排行榜或大型用户网站的绝佳示例。此包将创建一个从Redis有序集合生成的Laravel LengthAwarePaginator。由于有序集合始终是有序的,因此它允许大量记录进行分页,同时开销很小。

安装

您可以通过composer安装此包

composer require ge-tracker/laravel-redis-paginator

用法

通过依赖注入或提供的RedisPaginator外观来初始化分页器。下面的示例将交互leaderboard有序集合。我们利用Laravel的Redis接口,它将尊重你在应用程序上配置的任何前缀和集群选项。

以下是分页有序集合操作的示例

public function index(LaravelRedisPaginator $redisPaginator)
{
    $users = $redisPaginator->perPage(25)->paginate('leaderboard');

    return view('leaderboard', compact('users'));
}

排序

sortAscsortDesc方法允许你选择返回结果顺序。默认排序是升序。

$usersAsc = $redisPaginator->sortAsc()->paginate('leaderboard');

$usersDesc = $redisPaginator->sortDesc()->paginate('leaderboard');

获取用户的排名和页面

你可能想显示用户在有序集合中的排名,以及跳转到包含他们名字的页面的链接。这可以通过使用rank()方法来实现。将返回一个包含scorerankpage属性的MemberRank对象。

public function show(User $user, LaravelRedisPaginator $redisPaginator)
{
    $memberRank = $redisPaginator->rank('user:' . $user->id, 'leaderboard');

    dump($memberRank->score, $memberRank->rank, $memberRank->page);
}

使用外观

对于那些更喜欢外观而不是依赖注入的用户,此选项也适用

public function index()
{
    $users = RedisPaginator::perPage(25)->paginate('leaderboard');

    return view('leaderboard', compact('users'));
}

选择要查看的页面

可以通过使用page()方法或使用方法参数来设置当前页面。在底层,该包使用Laravel默认的Paginator的页面解析,这意味着页面也可以通过查询字符串指定。

// Using the fluent interface
$users = $redisPaginator->page(5)->paginate('leaderboard');

// Using method parameters
$users = $redisPaginator->paginate('leaderboard', 'page', 5);

// https://www.example.com/leaderboard?page=5
$users = $redisPaginator->paginate('leaderboard');

解析Eloquent模型

由于Redis是一个内存数据结构存储,而不是关系型数据库,因此与你的分页数据(例如leaderboard?)相关的实际数据可能并不完全存储在Redis中。在获取分页结果后,你需要加载数据,此包将为你处理。

在此示例中,我们假设你以以下格式存储数据

首先,创建一个Redis解析器。这可以放置在应用程序的任何位置,例如app/RedisResolvers/UserResolver.php

$modelKey属性应与用于生成Redis成员的键相对应。这通常是iduuid$scoreField属性定义了将映射到你的Eloquent模型或合并到结果数组中的字段。

<?php

namespace App\RedisResolvers;

use App\User;
use GeTracker\LaravelRedisPaginator\Resolvers\AbstractResolver;

class UserResolver extends AbstractResolver
{
    // Defaults shown below, can be omitted
    protected $modelKey = 'id';
    protected $scoreField = 'score';

    /**
     * Load Eloquent models
     */
    protected function resolveModels(array $keys)
    {
        return User::whereIn('id', $keys)->get();
    }

    /**
     * Resolve a key from Redis to an Eloquent incrementing ID or UUID
     */
    protected function resolveKey($key)
    {
        return (int)str_replace('user:', '', $key);
    }
}

resolveKey()方法将接受一个键(Redis成员),并允许你对其进行转换。在上面的示例中,我们在将字符串转换为整数之前,从字符串中移除了user:

然后,你可以定义resolveModels(),它接受一个要查询的已解析键数组。

最后,我们必须在运行查询之前设置我们的模型解析器

$users = $this->paginator
    ->setModelResolver(new \App\RedisResolvers\UserResolver())
    ->paginate('leaderboard');

现在,我们可以访问完整的用户模型,以及从Redis加载的分数

echo $users[0]->name . ' -> ' . $users[0]->score;

测试

composer test

变更日志

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

贡献

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

安全

如果您发现任何与安全相关的问题,请通过电子邮件james@ge-tracker.com联系,而不是使用问题跟踪器。

致谢

许可证

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