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
模型时应用它,但我可以' 想出一个原因,为什么你会想要总是跳过一个特定的记录。如果你不想显示它,为什么要把它放在数据库中?
好吧,几周前我才开始使用 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
模型时应用它,但我可以' 想出一个原因,为什么你会想要总是跳过一个特定的记录。如果你不想显示它,为什么要把它放在数据库中?