[Laravel 扩展推荐] sushi —— Eloquent 的数组驱动
Sushi#
Eloquent 缺少 "array" 驱动。
有时您想使用 Eloquent,但不处理数据库。
安装#
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;
这对于 "固定" 数据非常有用,例如州,国家 / 地区,邮政编码,user_roles,sites_settings 等。
关系#
假设您基于使用 Sushi 的数组创建了一个 Role
模型,如下所示:
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
列,您可以执行以下操作:
// 获取一个用户.
$user = User::first();
// 获取一个角色.
$role = Role::whereLabel('admin')->first();
// 关联它们.
$user->role()->associate($role);
// 像往常一样访问.
$user->role;
// 饥饿加载.
$user->load('role');
User::with('role')->first();
注意:处理 Sushi 模型关系时有一个警告。具有
whereHas
将不起作用。这是因为两个模型分布在两个单独的数据库中。
怎么运行的#
在后台,此程序包为此模型创建并缓存一个 SQLite 数据库。它创建一个表并填充行。如果由于某种原因它无法缓存.sqlite 文件,则默认使用内存中的 sqlite 数据库。
Using->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'],
];
}
}
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: