gpt4 book ai didi

php - eloquent - 查询生成器中的动态和条件 whereHas()

转载 作者:行者123 更新时间:2023-12-04 22:24:07 24 4
gpt4 key购买 nike

我正在努力避免 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() 方法附加到链中?

希望有人能帮忙。谢谢!

最佳答案

在调用 ->get() 之前查询不会执行,因此您可以非常简单地构建查询,有条件地添加 ->whereHas() 和然后执行它:

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

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

$products = $query->get();

关于php - eloquent - 查询生成器中的动态和条件 whereHas(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42319499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com