我的问题是简化与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过滤器吗?
答案 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;
}