首页 > 解决方案 > Laravel 搜索遵循 DRY 原则

问题描述

我有多个搜索功能,看起来都像这样:

    public function searchEntity(Request $request)
    {       
        ... // Some variables and other stuff 

        $q = $request->q;
        $entities = Entity::where('name', 'LIKE', '%' . $q . '%')->paginate(15);
        $entities->appends(['search' => $q]);
        return view(
            'entity',
            compact('entities', ...)
        );
    }

有没有更好的方法来做到这一点,每次我尝试搜索 Eloquent 实体时不重复相同的代码,或者将这些方法分开是否更好?

标签: laraveleloquent

解决方案


我的建议是创建具有范围的特征。

所以你的特质中会有这样的东西:

trait search
{
    public function scopeSearch(Builder $builder)
    {
        $request = request();
        $q = $request->q;

        return $builder->where('name', 'LIKE', '%' . $q . '%')->paginate(15);
    }

}

比在模型中使用您的特征。在每个模型的控制器中,您可以这样做:

$entities = Entity::search();

只需阅读有关 Traits 和 Scopes 的内容,我认为这就是您所需要的。

一些建议:link-1link-2

祝你好运!


推荐阅读