2017-02-18 58 views
0

我試圖在我的查詢生成器中避免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()方法追加到鏈中?

希望有人能幫助。謝謝!

回答

2

查詢沒有得到執行,直到調用->get()這樣你就可以很簡單地構建查詢,有條件地添加->whereHas(),然後執行它:

$query= $app->myShop->realProducts() 
    ->where($query) 
    ->skip($skip)->take($take) 
    ->orderBy($sortKey, $sortOrder); 

if (...) { 
    $query->whereHas(...); 
} 

$products = $query->get(); 
0

你可以這樣寫:

$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(); 

希望它可以幫助你;)

+0

我認爲這不會給出所需的結果,因爲它會跳過沒有'colour'關係的'realProducts()'。 –