owenmelbz / sashimi
Eloquent 缺失的 "数组" 驱动程序。
Requires
- php: ^7.1.3
- illuminate/database: ^5.8 || ^6.0 || ^7.0
- illuminate/support: ^5.8 || ^6.0 || ^7.0
Requires (Dev)
- doctrine/dbal: ^2.10
- orchestra/database: 3.8.* || 3.9.* || ^4.0
- orchestra/testbench: 3.8.* || 3.9.* || ^4.0
- phpunit/phpunit: ^7.5 || ^8.4 || ^9.0
README
Eloquent 缺失的 "数组" 驱动程序。
有时您想使用 Eloquent,但又不想处理数据库。
重要通知
这是一个 https://github.com/calebporzio/sushi 的分支 - 然而,它允许您在没有完整 Laravel 安装的情况下运行 Sushi,让您将其拉入其他框架,它有 90% 是 Celebs 的代码,并添加了一些绕过核心 Laravel 功能(如 IoC 容器和全局辅助函数)的工作方案。
安装
composer require owenmelbz/sashimi
使用
使用此包包括两个步骤
- 将
\Sashimi\Sushi
特性添加到模型中。 - 将
$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'], ]; } }