我试图在我的查询生成器中避免DRY,特别是在链中添加其他方法。
例如,这最初是我拥有的查询生成器:
$products = $app->myShop->realProducts()
->where($query)
->skip($skip)->take($take)
->orderBy($sortKey, $sortOrder)
->get();
然后,如果用户使用了一些过滤器,我需要将一个方法(特别是 a 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()
方法附加到链中?
希望有人可以提供帮助。谢谢!