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

翻译 Insua ⋅ 于 2周前 ⋅ 316 阅读 ⋅ 原文地址

站点的翻译文章创建时,您将第一时间收到通知。

这是一篇社区协同翻译的文章,已完成翻译,更多信息请点击 协同翻译介绍

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');
}
XiaohuiLam 翻译于 2周前
medz 审阅

我相信你对这种范围式查询有深刻的理解和自己的方法。我们可以通过 scope 来获取已经发布的帖子。

Post::published()->get();

你可能有一个额外的 条件 方法来标识帖子的个别状态:

/**
 * @return bool
 */
public function isPublished()
{
    return $this->status === 'published' &&
           $this->published_at !== null;
}

你可以在模型里使用 Eloquent status 包,帮助你解决这些问题。

若相惜 翻译于 2周前

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');
    }

    // 其他...
}
若相惜 翻译于 2周前

接下来,为了支持状态检查您需要在模型上定义特性:

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
purple_ling 翻译于 2周前

我最喜欢这个包的功能是可以猜测模型状态:

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

若相惜 翻译于 2周前

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

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


本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

回复数量: 0
    暂无评论~~
    您需要登陆以后才能留下评论!

    Composer 中国全量镜像

    Top 100 扩展包

    Lumen 中文文档

    Laravel 速查表

    Laravel 中文文档

    Laravel 项目开发规范

    Laravel 开发环境部署

    Elasticsearch-PHP 中文文档

    Lumen 中文文档

    GraphQL PHP 中文文档

    社区文档撰写指南

    TDD 构建 Laravel 论坛笔记

    PHP PSR 标准规范

    PHP 设计模式全集

    Dingo API 中文文档