对 laravel 的查询以从“已填充”且不为空的 db 行中获取百分比

Posted

技术标签:

【中文标题】对 laravel 的查询以从“已填充”且不为空的 db 行中获取百分比【英文标题】:A query for laravel to fetch percentage from the db rows which are "filled" and not empty 【发布时间】:2021-03-15 19:47:29 【问题描述】:

我们如何获取表中用户填写的行中字段的百分比,以及从其他表行中获取与父用户有关系的关系百分比。表格示例

汽车表

id     name     wheels     windshields     seats
1     Hyundai    113           221           16
2       BMW      114           154           
3     Toyota                    2

如果我尝试从上表中找到百分比,结果应该是这样的:

1 = 100% details filled
2 = 80% details filled
3 = 60% details filled

现在,如果我试图让关系参与其中

***桌

id    wheel_type        price
113     alloy            
114  chrome coated       
115     rims             946

检查汽车表结果的关系百分比后应该是这样的:

1 = 90% details filled
2 = 60% details filled
3 = 60% details filled

我必须在 Laravel 中做什么才能得到这样的结果

【问题讨论】:

【参考方案1】:

计算模型属性填充百分比的特征

<?php

namespace App\Models;

trait CalculatesFilledPercentage

    public function filled()
    
        $attributes = collect($this->attributes);

        $totalCount  = $attributes->count();
        $filledCount = 0;

        $attributes->keys()
            ->map(function ($key) use (&$filledCount) 
                !empty($this->$key) ? $filledCount++ : $filledCount;
            );

        return ($filledCount / $totalCount) * 100;
    

那么对于所有汽车记录

Car::all()->mapWithKeys(function($car)
    return [$car->id => "$car->filled()% details filled"];
);

对于关系,需要解决两种情况:

HasOne 关系 一个相关的记录 - 相对容易计算填充父母俱乐部 HasMany 关系 许多相关记录 - 不容易填写父级俱乐部详细信息

【讨论】:

以上是关于对 laravel 的查询以从“已填充”且不为空的 db 行中获取百分比的主要内容,如果未能解决你的问题,请参考以下文章

选择所有 3 列同时不为空的位置(Laravel 查询生成器)

Excel filter函数怎么提取数值大于0切不为空的行?

Oracle中查询某字段不为空的SQL语句怎么写

从组合框中过滤查询(为 Null 且不为空)

Mybatis中关于字符串字段的判断不为空且不为null

查询以获取不为空且不匹配字符串的最新构建说明