好吧,几周前我就开始使用Laravel了,很抱歉,如果我重复一些明显的事情,那么......就是这样:
我在Photo模型中有几个查询范围:
public function scopeSkipFirst($query)
{
return $query->where('id', '>', 1);
}
public function scopeSearch($query, $search)
{
return $query->where('title', 'LIKE', "%$search%");
}
现在,我希望每次使用该模型进行Eloquent查询时都会执行第一个,例如Photo::all()
;我希望第二个查询范围可用于任何其他模型。
这样做的最佳做法是什么?这两种情况都是global scopes
吗?我一直在阅读一些帖子(如this one),但我对于我应该引用哪些文档没有明确的想法(Laravel的4.2#Global scopes section
; 5.1 Eloquent的#Events
;¿? )。
答案 0 :(得分:5)
如果您希望所有模型都使用scopeSearch()
方法,那么将其移至特征然后将该特征应用于模型是有意义的。像Searchable
:
trait Searchable
{
public function scopeSearch($query, $search)
{
return $query->where($this->getSearchField(), 'LIKE', "%$search%");
}
protected function getSearchField()
{
return 'title';
}
}
我还使列可配置,因为并非所有模型都有title
列。例如,当我在我的应用程序中创建Article
模型时,我将使用headline
列而不是title
。
使用上述特征,您可以通过实现特征来搜索模型:
class Photo extends Model
{
use Searchable;
}
您不希望将其作为全球范围。全局范围适用于每个查询。并非每个查询都是搜索查询,也不会将任何内容作为搜索查询传递。
scopeSkipFirst()
方法, 可以成为全局范围,如果您希望在查询Photo
模型时应用它,但我想不出来为什么你想要总是跳过特定记录的原因。如果您不想显示它,为什么要在数据库中使用它?