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

时间:2015-09-24 12:26:41

标签: 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%");
}

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

这样做的最佳做法是什么?这两种情况都是global scopes吗?我一直在阅读一些帖子(如this one),但我对于我应该引用哪些文档没有明确的想法(Laravel的4.2#Global scopes section; 5.1 Eloquent的#Events;¿? )。

1 个答案:

答案 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模型时应用它,但我想不出来为什么你想要总是跳过特定记录的原因。如果您不想显示它,为什么要在数据库中使用它?