[扩展推荐] Laravel Eloquent 状态 管理支持

file
由 Rasmus Christoffer Nielsen 提供的 Laravel Eloquent Status 包是一个帮你检查 eloquent model 状态而不用使他们零乱的包.

我相信我们大多数都搭建过这样的应用场景: 好比你有一个 post 的 model 且里面有这几个状态  draftscheduled, 和 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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://laravel-news.com/laravel-eloquen...

译文地址:https://learnku.com/laravel/t/13958/exte...

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!