我試圖在我的查詢生成器中避免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()'。 –