owenmelbz/sashimi

Eloquent 缺失的 "数组" 驱动程序。

维护者

详细信息

github.com/OwenMelbz/sashimi

源代码

资助包维护!
owenmelbz
calebporzio

v3.0.1 2020-07-31 11:33 UTC

This package is auto-updated.

Last update: 2024-08-29 05:33:30 UTC


README

Eloquent 缺失的 "数组" 驱动程序。

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

重要通知

这是一个 https://github.com/calebporzio/sushi 的分支 - 然而,它允许您在没有完整 Laravel 安装的情况下运行 Sushi,让您将其拉入其他框架,它有 90% 是 Celebs 的代码,并添加了一些绕过核心 Laravel 功能(如 IoC 容器和全局辅助函数)的工作方案。

安装

composer require owenmelbz/sashimi

使用

使用此包包括两个步骤

  1. \Sashimi\Sushi 特性添加到模型中。
  2. $rows 属性添加到模型中。

就是这样。

class State extends Model
{
    use \Sashimi\Sushi;

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

现在,您可以在任何您喜欢的位置使用此模型,它将表现得就像您创建了一个包含您提供的行的表。

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

这对于“固定”数据(如国家、州、邮编、用户角色、网站设置等)非常有用。

关系

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

class Role extends Model
{
    use \Sashimi\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 方法将不会工作。这是因为两个模型分布在两个不同的数据库中。

自定义模式

如果 Sushi 的模式自动检测系统不符合您对提供的行数据的特定要求,您可以使用 $schema 属性或 getSchema() 方法来自定义它们。

class Products extends Model
{
    use \Sashimi\Sushi;

    protected $rows = [
        ['name' => 'Lawn Mower', 'price' => '226.99'],
        ['name' => 'Leaf Blower', 'price' => '134.99'],
        ['name' => 'Rake', 'price' => '9.99'],
    ];

    protected $schema = [
        'price' => 'float',
    ];
}

工作原理

在底层,此包为该模型创建并缓存了一个 SQLite 数据库。它创建一个表并填充行。如果由于某种原因无法缓存 .sqlite 文件,它将默认使用内存中的 sqlite 数据库。

使用 ->getRows()

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

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

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

class Role extends Model
{
    use \Sashimi\Sushi;

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