2017-02-18 96 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()'。 –