使用多个过滤器和分页简化口才的Laravel吗?

时间:2018-12-17 22:21:55

标签: php mysql laravel object eloquent

我的问题是简化与Laravel分页一起使用的多个Eloquent查询。

我正在建立一个Laravel网站,人们可以在该网站上共享某些食谱。

我有多个变量,成员可以搜索,过滤和查看谷底。 因此,成员可以发布食谱并添加:  -类型  -持续时间  -国家  -平台

这个想法是,存在一个包含所有配方的页面,但是也有一些页面仅应用了1个,2个或更多过滤器的配方。例如。 5分钟的冷食谱或德国暖长食谱。

我使用Laravel 5.7,现在使用不同的where语句构建所有类型的查询。像这样:

 public static function getRecipesMixFilter($cid, $pid, $tid, $did)
{
    $recipes = self::with(['member', 'platform', 'member.platform', 'member.duration', 'member.type'])->whereActive(1)->whereHas('member', function ($query) use ($cid, $pid, $tid, $did) {
            $query->where('country_id', '=', $cid)
            ->where('platform_id', '=', $pid)
            ->where('type_id', '=', $tid)
            ->where('duration_id', '=', $did);
    })->orderBy('updated_at', 'desc')->paginate(24);

    return $recipes;
}

但是执行此操作的简单方法是什么?现在我有15个不同的查询,我觉得可能是1。因此-> where('platform_id','=',1)等是可选的。

当我尝试对每个对象进行过滤时,首先是第一个平台,然后是Type等,我无法应用分页。

有没有办法简化这一过程?我可以在Laravel分页中使用Ajax过滤器吗?

1 个答案:

答案 0 :(得分:1)

您可以通过以下操作将它们设置为可选:

public static function getRecipesMixFilter($cid = null, $pid = null, $tid = null, $did = null)
{
    $recipes = self::with(['member', 'platform', 'member.platform', 'member.duration', 'member.type'])
        ->whereActive(1)
        ->whereHas('member', function ($query) use ($cid, $pid, $tid, $did) {
            if ($cid) {
                $query->where('country_id', '=', $cid)
            }
            if ($pid) {
                $query->where('platform_id', '=', $pid)
            }
            if ($tid) {
                $query->where('type_id', '=', $tid)
            }
            if ($did) {
                $query->where('duration_id', '=', $did)
            }
        })->orderBy('updated_at', 'desc')->paginate(24);

    return $recipes;
}