我试图在我的查询生成器中避免DRY,特别是在链中添加其他方法。eloquent - 动态和条件whereHas()在查询生成器
实施例,这是最初的查询器,我有:
$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()
方法追加到链中?
希望有人能帮助。谢谢!
我认为这不会给出所需的结果,因为它会跳过没有'colour'关系的'realProducts()'。 –