[扩展推荐] Laravel Eloquent 状态 管理支持
由 Rasmus Christoffer Nielsen 提供的 Laravel Eloquent Status 包是一个帮你检查 eloquent model 状态而不用使他们零乱的包.
我相信我们大多数都搭建过这样的应用场景: 好比你有一个 post 的 model 且里面有这几个状态 draft
, scheduled
, 和 published
. 在 Laravel 里你可以简单地用本地查询来构建 scope, 查询这些态.
/**
* 限定一个查询只包含热门用户
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopePublished($query)
{
return $query
->where('status', 'published')
->whereNotNull('published_at');
}
我相信你对这种范围式查询有深刻的理解和自己的方法。我们可以通过 scope 来获取已经发布的帖子。
Post::published()->get();
你可能有一个额外的 条件 方法来标识帖子的个别状态:
/**
* @return bool
*/
public function isPublished()
{
return $this->status === 'published' &&
$this->published_at !== null;
}
你可以在模型里使用 Eloquent status 包,帮助你解决这些问题。
Eloquent Status 扩展包
使用 Eloquent Status API,你可以检查你的模型状态:
Post::status('published')->get();
对于模型实例,你可以用 checkStatus
方法来检查状态:
$post->checkStatus('scheduled'); // true or false
如果你这样使用,首先需要为状态创建一个 PostStatus
类:
use \Makeable\EloquentStatus\Status;
class PostStatus extends Status
{
public function published($query)
{
return $query->where('status', 'published')
->whereNotNull('published_at');
}
public function scheduled($query)
{
return $query->where('status', 'scheduled')
->whereNotNull('scheduled_at');
}
// 其他...
}
接下来,为了支持状态检查您需要在模型上定义特性:
use \Makeable\EloquentStatus\HasStatus;
class Post extends Eloquent
{
use HasStatus;
}
使用特性后,您可以使用 PostStatus
类来查询数据库:
Post::status(new PostStatus('published'))->get();
这种技术与我们的范围方法非常接近,但该软件包的作者提出了这种方法的一些好处:
- 我们已经在一个地方定义并封装了我们所有的状态,使我们的模型变得杂乱无章
- 我们只能查询有效状态
尝试查询一个无效状态的时候将会抛出如下异常:
Post::status(new PostStatus('bupkis'))->get();
接下来,您可以使用相同的状态定义来检查模型实例是否具有给定状态,由 Rasmus 命名为 laravel-query-kit:的另一个包提供支持:
$post->checkStatus(new PostStatus('published')); // Bool
我最喜欢这个包的功能是可以猜测模型状态:
<?php
use Makeable\EloquentStatus\HasStatus;
class Post extends Eloquent
{
use HasStatus;
public function getStatusAttribute()
{
return PostStatus::guess($this);
}
}
// 用例
$post->status
学习更多
可以到扩展包的 GitHub 仓库 获取完整的安装和使用说明。 Rasmus 在他的文章 An eloquent way of handling model state 也提到了关于这个包的一些东西。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: