在Laravel中自动从查询中排除(如softDeletes)?

时间:2017-07-20 04:46:43

标签: laravel eloquent

所以,我的一张桌子上有一个'is_abandoned'布尔值,如果它是true,我希望模型能够自动从任何查询中排除 - 只是像softDeletes一样。

我可以在模型中设置一些能实现这一目标的东西吗?我倾向于可能是一个变异者?

3 个答案:

答案 0 :(得分:1)

这些称为Global Query Scopes

  

编写全局范围很简单。定义实现SELECT * FROM joke LEFT JOIN jokevote ON joke.user_id=jokevote.user_id WHERE jokevote.vote=? 接口的类。此界面要求您实现一种方法:Illuminate\Database\Eloquent\Scopeapply方法可以根据需要向查询添加apply个约束:

where
  

要为模型分配全局范围,您应该覆盖给定模型的<?php namespace App\Scopes; use Illuminate\Database\Eloquent\Scope; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; class AgeScope implements Scope { /** * Apply the scope to a given Eloquent query builder. * * @param \Illuminate\Database\Eloquent\Builder $builder * @param \Illuminate\Database\Eloquent\Model $model * @return void */ public function apply(Builder $builder, Model $model) { $builder->where('age', '>', 200); } } 方法并使用boot方法:

addGlobalScope

答案 1 :(得分:0)

你可以使用eloquent where function

来排除记录
$lists = List::where('is_abandoned',false);

答案 2 :(得分:0)

以下是一个例子:

Eloquent

中创建一个功能
class User extends Eloquent {

    public function scopeAbandoned($query)
    {
        return $query->where('is_abandoned', '=', 1/*true*/);
    }

}

然后简单地使用它:

$approvedPosts = Post::abandoned()-><put_your_own_condition>;

详细信息请阅读Eloquent Query Scopes。 没有重复的WHERE函数调用。希望它有效。