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

Laravel 5.1 global scopes... Where should I go?

好吧,几周前我才开始使用 Laravel,很抱歉,如果我重复了一些显而易见的事情,但是...事情是这样的:

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

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's 4.2 # Global scopes section; 5.1 Eloquent的#Events;??).

如果您希望所有模型都有一个 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 模型时应用它,但我可以' 想出一个原因,为什么你会想要总是跳过一个特定的记录。如果你不想显示它,为什么要把它放在数据库中?