限制一条记录使用雄辩的all()函数


Laravel 5 - restricting a record from eloquent all() function

我有一个与用户表相关的AccountType模型。

public function users()
    {
        return $this->hasMany('App'User','account_type_id');
    }

我们已经建立了基于AccountType的网站与数据(普通用户,编辑器,管理员),现在我们要添加一个新的类型作为SuperAdmin这是为网站管理员。但是我们不希望在调用AccountType::all()代码的地方以及在用户搜索结果中显示该帐户类型。我们在大多数地方都使用了all()函数。所以我们不想到处改变它。是否有任何方法可以只覆盖这个AccountType模型的默认函数?

将此方法添加到AccountType模型中。这个方法将覆盖Model::all()——默认方法。

public static function all($columns = array('*'))
    {
        $columns = is_array($columns) ? $columns : func_get_args();
        $instance = new static;
        return $instance->newQuery()->where('account_type', '!=', 'SuperAdmin')->get($columns);
    }

最好的方法(不是最简单的)是创建一个全局作用域。比如SoftDelete特性,它从你的查询中删除所有已删除的实体。

为AccountType添加一个全局作用域,以永久地从所有查询中删除SuperAdmin。

示例:AccountType::all()将返回['Normal User', 'Editor']

AccountType::withSuperAdmin()->all()将返回前一个数组加上SuperAmin类型。

参见:http://softonsofa.com/laravel-5-eloquent-global-scope-how-to/

你不需要使用Sofa Package来使这个工作。

打开SoftDelete特性,试着理解为什么会这样。

最简单的方法是将SuperAdmin id放在您的配置中,并在AccountType model中覆盖all()方法:

public static function all($columns = ['*'])
{
  $columns = is_array($columns) ? $columns : func_get_args();
  return static::where('id', '<>', Config::get('app.super_admin_id')->get($columns);
}

如果你想从你的应用程序所做的所有SELECT查询中排除SuperAdmin,你也可以检查Eloquent的全局作用域 -一个例子是SoftDeletes特性,你可以在这里阅读:http://laravel.com/docs/5.1/eloquent#soft-deleting。这将需要更多的代码,也将在全球范围内工作,所以你需要更新你如何获取帐户类型,你想要SuperAdmin返回。