我可以使用where方法和其他一些Model的方法过滤laravel集合吗?

时间:2016-01-16 05:27:19

标签: laravel laravel-5 eloquent

我有一个名为Billboard的模型。在这个模型中,我写了一个方法isDisplayable()

   public function isDisplayable()
   {
      if  (/* Logic to determine if billboard is displayable */)
        return true;
     return false;
   }

我想要只显示广告牌的集合。我可以在isDisplayable()中使用 Where 方法吗?或者我应该采取其他方法吗?

1 个答案:

答案 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();