Laravel 5.1全球范围......我应该去哪里?

use*_*115 0 php laravel laravel-5.1

好吧,几周前我就开始使用Laravel了,很抱歉,如果我重复一些明显的事情,那么......这就是事情:

我在Photo模型中有几个查询范围:

public function scopeSkipFirst($query) 
{
    return $query->where('id', '>', 1);
}

public function scopeSearch($query, $search) 
{
    return $query->where('title', 'LIKE', "%$search%");
}
Run Code Online (Sandbox Code Playgroud)

现在,我希望每次通过该模型进行Eloquent查询时都会执行第一个,例如Photo::all(); 我希望第二个查询范围可用于任何其他模型.

这样做的最佳做法是什么?这两种情况都是global scopes?我一直在读几篇文章(比如这篇文章),但我对于我应该参考哪些文档没有明确的想法(Laravel的4.2#Global scopes section; 5.1 Eloquent 的#Events;¿?).

Mar*_*ean 5

如果您希望所有模型都有scopeSearch()方法,那么将其移动到特征然后将该特征应用于模型是有意义的.像这样的东西Searchable:

trait Searchable
{
    public function scopeSearch($query, $search) 
    {
        return $query->where($this->getSearchField(), 'LIKE', "%$search%");
    }

    protected function getSearchField()
    {
        return 'title';
    }
}
Run Code Online (Sandbox Code Playgroud)

我也使列可配置,因为并非所有模型都有title列.例如,当我Article在我的应用程序中创建模型时,我将使用headline列而不是title.

有了上述特性,您可以通过实现特征来搜索模型:

class Photo extends Model
{
    use Searchable;
}
Run Code Online (Sandbox Code Playgroud)

您不希望将其作为全局范围.全局范围适用于每个查询.并非每个查询都是搜索查询,也不会将任何内容作为搜索查询传递.

如果您希望在查询模型时应用该scopeSkipFirst()方法,则该方法可以成为全局范围Photo,但我想不出您希望始终跳过特定记录的原因.如果您不想显示它,为什么要在数据库中使用它?