[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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
早就该有的 Eloquent 驱动
有意思。
场景有限。