eloquent - 查询构建器

时间:2017-02-18 19:09:31

标签: php laravel eloquent laravel-eloquent

我试图避免在我的查询构建器中使用DRY,特别是在链中添加其他方法。

示例,这最初是我的查询构建器:

$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()方法附加到链中?

希望有人可以提供帮助。谢谢!

3 个答案:

答案 0 :(得分:7)

在您致电->get()之前,查询无法执行,因此您可以非常简单地构建查询,有条件地添加->whereHas()然后执行它:

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

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

$products = $query->get();

答案 1 :(得分:1)

您可以这样写:

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

希望对你有帮助;)

答案 2 :(得分:0)

可以使用Query Builder Conditional Clauses

    $products = $app->myShop->realProducts()
        ->where($query)
        ->when($user_filtered_this_page, function($query) use($find){
            $query->whereHas('colour', function ($q) use ($find) {
                $q->where('colour_slug', $find);
            })
        })
        ->skip($skip)->take($take)
        ->orderBy($sortKey, $sortOrder)
        ->get();