involix/sushi

Eloquent 缺失的 "array" 驱动器。

维护者

详细信息

github.com/involix/sushi

源代码

资助包维护!
calebporzio

1.0.5 2020-02-08 23:59 UTC

This package is auto-updated.

Last update: 2024-09-05 07:28:04 UTC


README

Eloquent 缺失的 "array" 驱动器。

有时你想使用 Eloquent,但又不想处理数据库。

此包是赞助软件 💰💰💰

最初,这个包仅在我的 GitHub Sponsors 赞助者中可用,直到我达到 75 个赞助者。

现在我们已经达到目标,这个包现在是完全开源的。

享受吧,感谢您的支持! ❤️

安装

composer require calebporzio/sushi

使用

使用此包分为两个步骤

  1. Sushi 特性添加到模型中。
  2. 向模型添加一个 $rows 属性。

这就完了。

class State extends Model
{
    use \Sushi\Sushi;

    protected $rows = [
        [
            'abbr' => 'NY',
            'name' => 'New York',
        ],
        [
            'abbr' => 'CA',
            'name' => 'California',
        ],
    ];
}

现在,您可以在任何需要的地方使用此模型,它将表现得像您创建了一个具有您提供的行的表。

$stateName = State::whereAbbr('NY')->first()->name;

这对于“固定”数据非常有用,例如国家、地区、邮编、用户角色、站点设置等...

关系

假设您创建了一个 Role 模型,使用 Sushi 通过数组创建,如下所示

class Role extends Model
{
    use \Sushi\Sushi;

    protected $rows = [
        ['id' => 1, 'label' => 'admin'],
        ['id' => 2, 'label' => 'manager'],
        ['id' => 3, 'label' => 'user'],
    ];
}

您可以为另一个标准模型添加关系,就像通常那样

class User extends Model
{
    ...

    public function role()
    {
        return $this->belongsTo(Role::class);
    }
}

假设 users 表有一个 role_id 列,您可以这样做

// Grab a User.
$user = User::first();
// Grab a Role.
$role = Role::whereLabel('admin')->first();

// Associate them.
$user->role()->associate($role);

// Access like normal.
$user->role;

// Eager load.
$user->load('role');
User::with('role')->first();

注意:处理 Sushi 模型关系时有一个注意事项。使用 whereHas 方法将不起作用。这是因为两个模型分布在两个不同的数据库中。

工作原理

在内部,这个包仅为这个模型创建和缓存了一个 SQLite 数据库。它会创建一个表并填充行。如果由于任何原因无法缓存 .sqlite 文件,它将默认使用内存中的 SQLite 数据库。

使用 ->getRows()

您可以选择不使用 protected $rows 属性,并直接实现自己的 getRows() 方法。

这将允许您在运行时确定模型的行。您甚至可以从第三方 API 等外部源生成模型行。

注意:如果您选择使用自己的 ->getRows() 方法,行将在请求之间不会进行缓存。

class Role extends Model
{
    use \Sushi\Sushi;

    public function getRows()
    {
        return [
            ['id' => 1, 'label' => 'admin'],
            ['id' => 2, 'label' => 'manager'],
            ['id' => 3, 'label' => 'user'],
        ];
    }
}