我有一个名为Billboard的模型。在这个模型中,我写了一个方法isDisplayable()
。
public function isDisplayable()
{
if (/* Logic to determine if billboard is displayable */)
return true;
return false;
}
我想要只显示广告牌的集合。我可以在isDisplayable()中使用 Where 方法吗?或者我应该采取其他方法吗?
答案 0 :(得分:2)
如果您已经拥有该集合,则可以使用filter()
方法根据您的模型方法过滤掉结果:
$billboards = Billboard::all();
$filtered = $billboards->filter(function ($billboard, $key) {
// true to keep; false to remove
return $billboard->isDisplayable();
});
如果要在查询中使用此逻辑(在构建集合之前),您可以在Billboard
模型上创建查询范围:
public function scopeDisplayable($query, $displayable = true)
{
if ($displayable) {
// modify $query to only get displayable items, e.g:
$query->where('displayable', '=', 1);
} else {
// modify $query to only get non-displayable items, e.g:
$query->where('displayable', '=', 0);
}
}
// use your new query scope like any other method on the query builder:
// displayable billboards:
$billboards = Billboard::displayable()->get();
// non-displayable billboards:
$billboards = Billboard::displayable(false)->get();