Laravel 获取符合条件的列行数

Laravel get count of column rows with condition

假设我有 table 个

ID      Col1     Col2       Col3       Col4     Col5

1       Hello    ""         Hi          ""       ""
2       two      ""         Hi          here     ""

我想获取 Col(X) 的计数而不包括空列。所以对于记录 1,我必须有 2 的计数,对于记录 2,我有 3

如何在 MySQL 或 Laravel 的 Eloquent 或查询生成器中执行此操作?提前致谢。

试试这个解决方案:

$data = DB::table('MyTable')->get();

在 laravel 中使用类似这样的查询从 table 获取所有数据。它是 return 对象数组。因此,使用 for each 循环迭代您的数组,并检查列是否为空。

如果任何列为空,则什么也不做。

但是如果任何列的值 count+1 添加到您的结果数组中。

$result = [];

foreach($data as $object)
{
    $result[$object->id] = 0;

    foreach($object as $key => $value) 
    {        
        if(!empty($value))
        {
            if($key != 'id')
            {
                $result[$object->id] = $result[$object->id] + 1;
            }
        }
    }
}

var_dump($result);

Muhammad 的回答在大数据集上可能会变得非常慢。

这样试试。

DB::table('model')
    ->select(DB::raw('
        (is_null(Col1) OR Col1 = '') +
        (is_null(Col2) OR Col2 = '') +
        (is_null(Col3) OR Col3 = '') +
        (is_null(Col4) OR Col4 = '') +
        (is_null(Col5) OR Col5 = '') 
            as NumberofNulls'
    ))

现在应该计算其中包含 NULL 或空字符串的列

您想要的是对非空字段求和。在 MySQL 中它看起来像:

SELECT *, SUM((Col1!='') + (Col2!='') + (Col3!='') + (Col4!='') + (Col5!='')) as NotEmptyFields 
FROM table 
GROUP BY ID;

在 Laravel 中看起来像:

Model::select(DB::raw('*, SUM((Col1!="") + (Col2!="") + (Col3!="") + (Col4!="") + (Col5!="")) as NotEmptyFields'))
    ->groupBy('ID')
    ->get();