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

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 也提到了关于这个包的一些东西。

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

译文地址:https://laravel-china.org/topics/13958/e...

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!