laravel 如何正确地筛选查询中的行?

dtcbnfnu  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(117)

我想过滤与条件和计数> 0有关系的记录
代码:

$classClass = ClassClass::query()
        ->with('parent')
        ->with('children', function (BelongsTo $query) {
            $query
                ->withCount(['serialNumbers' => function($query) {
                    $query
                        ->whereNull('serial_number_parent_id')
                        ->whereNull('inherit_class_for_serial_number_id');
                }]);
        })
        ->where('parent_class_id','=', $class->id)
        ->orderBy('id')
        ->get();

字符串
正如你所看到的,我得到了一个类记录,它有一个相关的子类记录,子类记录有serialNumbers和condition。我想在这个sql生成查询类中过滤serialNumbers的计数,我怎么做?
PS我想添加having {children}->serial_numbers_count > 0语句

lvmkulzt

lvmkulzt1#

找到一个解决方案:

$classClass = ClassClass::query()
        ->with('parent')
        ->whereHas('children.serialNumbers', function (Builder $query) {
            $query
                ->whereNull('serial_number_parent_id')
                ->whereNull('inherit_class_for_serial_number_id');
        }, '>=',1)
        ->where('parent_class_id','=', $class->id)
        ->orderBy('id')
        ->get();

字符串

gojuced7

gojuced72#

有很多方法可以清理你的代码:
我将使用范围,我最喜欢的清理代码的方法,你可以根据自己的喜好调整:

  • Children.php*
//Create a scope
function scopeWithSerialNumbersCount($query, $count = null){
    $query->withCount(['serialNumbers' => function ($query) {
        $query
            ->whereNull('serial_number_parent_id')
            ->whereNull('inherit_class_for_serial_number_id');
    }]);

    if($count > 0){
        $query->having('serial_numbers_count', '>=', $count);
    }
}

字符串
那你可以这么叫

$classClass = ClassClass::query()
        ->with('parent')
        ->with('children', function ($query) {
            $query->withSerialNumbersCount(5);
            // Or if don't want having
            $query->withSerialNumbersCount();
        })
        ->where('parent_class_id', '=', $class->id)
        ->orderBy('id')
        ->get();

相关问题