Laravel Eloquent查询生成器默认条件

时间:2014-06-30 07:14:04

标签: php laravel laravel-4 eloquent

我有新闻模型,当我查询新闻时,我希望它带来新闻,其中status = 1为默认值。

News::all(); // select * from news where status = 1
News::where('anotherColumn',2)->get(); // select * from news where status = 1 and where category = 2

这可能吗?我想要的是如此类似于软删除功能(它获取的地方,如果deleted_at不为null,如果需要所有数据,则可以使用withTrashed函数)。

我看了文档,但我找不到任何有用的东西。此外,我试图在新闻模型的构造中处理它,但它也没有用。

感谢。

3 个答案:

答案 0 :(得分:23)

我通常会覆盖newQuery()newQuery()是Eloquent用于构造新查询的方法。

class News extends Eloquent {

    public function newQuery($excludeDeleted = true) {
        return parent::newQuery($excludeDeleted)
            ->where(status, '=', 1);
    }

}

现在,您的News::all()只会输出状态为1的新闻。

答案 1 :(得分:7)

我认为关闭你会得到,而不会真正改变一些核心文件...

是查询范围...

使用范围可以轻松地在模型中重复使用查询逻辑。要定义范围,只需在模型方法前加上范围:

class News extends Eloquent {
   public function scopeStatus($query)
    {
     return $query->where('status', '=', 1);
    }
 }

利用该范围

 $news  = News::status()->get();
 $news2  = News::status()->where('anotherColumn',2)->get();

它不是你想要的......但它肯定比打字短一点

 News::where('status','=',1)->get();

一遍又一遍

答案 2 :(得分:5)

已经提到过了,但是这里有一个使用全局范围的快速示例,它可能是当前最好的解决方案,因为您不必重写Eloquent方法,并且会导致相同的行为,但可以更好地控制模型。

只需将其添加到您的模型中:

protected static function boot()
{
    parent::boot();

    static::addGlobalScope('exclude_deleted', function (Builder $builder) {
        $builder->whereNull('deleted_at');
    });
}

您还可以创建子Scope类并将其重用于多个模型。

有关更多信息,Laravel doc几乎解释了它的一切: Lesson: Performing Custom Painting

相关问题