我有新闻模型,当我查询新闻时,我希望它带来新闻,其中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函数)。
我看了文档,但我找不到任何有用的东西。此外,我试图在新闻模型的构造中处理它,但它也没有用。
感谢。
答案 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