我试图避免在我的查询构建器中使用DRY,特别是在链中添加其他方法。
示例,这最初是我的查询构建器:
$products = $app->myShop->realProducts()
->where($query)
->skip($skip)->take($take)
->orderBy($sortKey, $sortOrder)
->get();
然后,如果用户使用了一些过滤器,我需要将一个方法(特别是whereHas()
)附加到查询构建器
$products = $app->myShop->realProducts()
->where($query)
->whereHas('colour', function ($q) use ($find) {
$q->where('colour_slug', $find);
})
->skip($skip)->take($take)
->orderBy($sortKey, $sortOrder)
->get();
我发现它"丑陋"要实现这个结果,我必须不断重复那些构建器查询:
if ($user_filtered_this_page == TRUE) {
$products = $app->myShop->realProducts()->where($query)
->whereHas('colour', function ($q) use ($find) {
$q->where('colour_slug', $find);
})
->skip($skip)->take($take)
->orderBy($sortKey, $sortOrder)
->get();
} else {
$products = $app->myShop->realProducts()->where($query)
->skip($skip)->take($take)
->orderBy($sortKey, $sortOrder)
->get();
}
是否有更聪明或更优雅的方式动态和有条件地将whereHas()
方法附加到链中?
希望有人可以提供帮助。谢谢!
答案 0 :(得分:7)
在您致电->get()
之前,查询无法执行,因此您可以非常简单地构建查询,有条件地添加->whereHas()
然后执行它:
$query= $app->myShop->realProducts()
->where($query)
->skip($skip)->take($take)
->orderBy($sortKey, $sortOrder);
if (...) {
$query->whereHas(...);
}
$products = $query->get();
答案 1 :(得分:1)
您可以这样写:
$products = $app->myShop->realProducts()->where($query)
->whereHas('colour', function ($q) use ($find) {
if ($user_filtered_this_page) {
$q->where('colour_slug', $find);
}
})
->skip($skip)->take($take)
->orderBy($sortKey, $sortOrder)
->get();
希望对你有帮助;)
答案 2 :(得分:0)
可以使用Query Builder Conditional Clauses
$products = $app->myShop->realProducts()
->where($query)
->when($user_filtered_this_page, function($query) use($find){
$query->whereHas('colour', function ($q) use ($find) {
$q->where('colour_slug', $find);
})
})
->skip($skip)->take($take)
->orderBy($sortKey, $sortOrder)
->get();