Laravel雄辩的搜索/过滤

时间:2020-01-08 16:08:51

标签: php laravel filtering

我正在为我的电影资料实现过滤/搜索功能,我来自symfony背景,并且在学习过程中一直学习laravel,因此我将在新的存储库(例如FilmRepository)中使用此查询来保持查询独立且控制器不那么混乱

我的第一个选择是在存储库中创建一个将所有这些表连接在一起的联接查询,但是,即使未选择特定的下拉选项,我是否希望它进行过滤/搜索呢?我对如何解决此功能失去了兴趣

这是我创建的原始回购功能,需要更多工作

存储库

 public function searchFilms()
    {
        $films= Film::from('films')
            ->join('categories', 'films.id', '=', 'categories.film_id')
            ->join('locations', 'id', '=', 'location.id')
            ->join('age_rating', 'id', 'age_rating.id')
            ->orderBy('updated_at', 'desc');
    }

我知道我将需要这些过滤器选项作为查询参数,如何在laravel中做到这一点?

我可以在解决该解决方案方面获得一些帮助吗?谢谢

1 个答案:

答案 0 :(得分:0)

在laravel控制器中,动作可以接收Request对象作为参数,可用于从前端获取过滤器。

public function searchFilms(Request $request)
{ 
    $data = $request->all();
    $user = Auth::user();

    return FilmResource::collection($this->repository->searchFilms($data));
}

Request类有多种获取数据的方法,您可以阅读this来了解它们,但是-> all()(更多有关here的方法之一)

然后将数据传递到searchFilms函数并应用过滤器

 public function searchFilms($filters)
 {
        $films= Film::from('films')
            ->join('categories', 'films.id', '=', $filters['film_id'])
            ->join('locations', 'id', '=', $filters['location_id'])
            ->join('age_rating', 'id', $filters['age_rating_id'])
            ->orderBy('updated_at', 'desc');
 }

类似的方法会起作用,我不知道您输入的名称,但是您可以从中得到一个想法。

已编辑

因此,为了在评论中阐明您的问题。

$ request-> all()将返回一个已发布数据的数组,其中输入的属性名称将是每个值的键。例如,假设我具有以下html形式:

<form>
 <input name="name" type="text" value="john doe" />
 <input name="age" type="text" value="39" />
</form>

$request->all()将是像这样的数组['title' => 'john doe', 'age' => '39'];