eriksulymosi/eloquent-sqids

Laravel Eloquent 模型的即时 sqids。

0.3.0 2024-08-28 15:43 UTC

This package is auto-updated.

Last update: 2024-09-28 15:49:43 UTC


README

在 URL 和列表项中使用 sqids 替代整数 ID 可以更加吸引人和巧妙。更多信息请访问 sqids.org

此包基于 mtvs 的 eloquent-hashids 包。

Eloquent-Sqids 构建状态

此包通过即时编码/解码 sqids 而不是在数据库中持久化它们,为 Laravel Eloquent 模型添加 sqids。因此,不需要另一个数据库列,并且通过使用查询中的主键提高性能。

功能包括

  • 为模型生成 sqids
  • 将 sqids 解析为模型
  • 可以为每个模型自定义 sqid 设置
  • 使用 sqids 绑定路由(可选)

安装

使用 Composer 安装包

$ composer require eriksulymosi/eloquent-sqids

此外,将供应商配置文件发布到您的应用程序中(对于依赖项是必要的)

$ php artisan vendor:publish

设置

通过使用 HasSqid 特性提供基本功能,然后可以使用 SqidRouting 添加路由绑定。

use Illuminate\Database\Eloquent\Model;
use ErikSulymosi\EloquentSqids\HasSqid;
use ErikSulymosi\EloquentSqids\SqidRouting;

Class Item extends Model
{
	use HasSqid, SqidRouting;
}

使用方法

基础

// Generating the model sqid based on its key
$item->sqid();

// Equivalent to the above but with the attribute style
$item->sqid;

// Finding a model based on the provided sqid or
// returning null on failure
Item::findBySqid($sqid);

// Finding a model based on the provided sqid or
// throwing a ModelNotFoundException on failure
Item::findBySqidOrFail($sqid);

// Decoding a sqid to its equivalent id 
$item->sqidToId($sqid);

// Encoding an id to its equivalent sqid
$item->idToSqid($id);

// Getting the name of the sqid connection
$item->getSqidsConnection();

将 sqid 添加到序列化模型

将其设置为默认值

use Illuminate\Database\Eloquent\Model;
use ErikSulymosi\EloquentSqids\HasSqid;

class Item extends Model
{
    use HasSqid;
    
    /**
     * The accessors to append to the model's array form.
     *
     * @var array
     */
    protected $appends = ['sqid'];
}

或指定特定值

return $item->append('sqid')->toJson();

隐式路由绑定

如果您想使用模型的哈希值解析模型的隐式路由绑定,可以在模型中使用 SqidRouting

use Illuminate\Database\Eloquent\Model;
use ErikSulymosi\EloquentSqids\HasSqid;
use ErikSulymosi\EloquentSqids\SqidRouting;

class Item extends Model
{
    use HasSqid, SqidRouting;
}

它覆盖了 getRouteKeyName()getRouteKey()resolveRouteBindingQuery() 以使用 sqids 作为路由键。

它支持 Laravel 的特定路由自定义键功能。

Route::get('/items/{item:slug}', function (Item $item) {
    return $item;
});

自定义默认路由键名称

如果您想默认使用其他字段解析隐式路由绑定,可以覆盖 getRouteKeyName() 以在解析过程中返回字段名称,并覆盖 getRouteKey() 以在链接中返回其值。

use Illuminate\Database\Eloquent\Model;
use ErikSulymosi\EloquentSqids\HasSqid;
use ErikSulymosi\EloquentSqids\SqidRouting;

class Item extends Model
{
    use HasSqid, SqidRouting;

    public function getRouteKeyName()
    {
        return 'slug';
    }

    public function getRouteKey()
    {
        return $this->slug;
    }
}

您仍然可以指定特定路由的 sqid。

Route::get('/items/{item:sqid}', function (Item $item) {
    return $item;
});

支持其他 Laravel 隐式路由绑定功能

当使用 SqidRouting 时,您仍然可以使用软删除和子路由绑定。

Route::get('/items/{item}', function (Item $item) {
    return $item;
})->withTrashed();

Route::get('/user/{user}/items/{item}', function (User $user, Item $item) {
    return $item;
})->scopeBindings();