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

我试图避免在查询构建器中使用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();

Laravel Blade模板尝试获取非对象的属性时如何返回null而不是ErrorException - php

我正在编写一些Laravel Blade模板,并且我的模型可能包含空对象。我非常想尝试获取对象属性,如果有错误,则返回null。因此,不必编写以下代码:@if ($model->child_object_that_may_be_null) {{ $model->child_object_that_may_be_null->interesti…

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

检查对象是否已在集合中-Laravel - php

当我循环一系列不同的结果时,我希望将对象添加到新集合中。查询:$osRed = Item::where('category', 'Hardware') ->where(function ($query) { $query->where('operating_system', '…

Laravel-foreach局部变量正在覆盖全局变量 - php

今天,我面临一个非常奇怪的问题。我有一个控制器,将从该控制器向视图sections thread和threads发送三个变量。在我看来,我正在使用foreach循环遍历所有部分,如下所示:@foreach($sections as $i => $section) 对于每个部分,我都将创建一个div并给出如下的ID:id="{{ $thread…

PHP Laravel:使用Ajax删除数据 - php

我想使用ajax从数据库中删除一些数据。.我已经完成了以下步骤来运行..但是,当我尝试删除它时,显示以下错误: 加载资源失败:服务器响应状态为404 (未找到)这是我的路线:Route::post('/delete/{id}',[ 'uses'=>'ItemController@delete'…