Laravel:计算多列

时间:2019-07-15 14:20:14

标签: php laravel eloquent laravel-blade

我需要计算一门课程记录的学生人数,但是他可以选择4门不同的课程,并且在我的数据库中,我有4列记录他的选择。

所以我的控制器会返回我需要的所有信息

public function index()
{
        //
        $extracurriculares = Extracurricular::all(); // the courses
        $cadastros = Cadastro::all();                // student informations inclunding his choises

        return view('extracurricular.index', compact('extracurriculares', 'cadastros'));
}

然后在我看来,我想显示课程中已经有多少学生

<tbody>
                        @foreach($extracurriculares->sortBy('created_at') as $extracurricular)
                            <tr>
                            <td >{{$extracurricular->aula}}</td>
                            <td >{{$extracurricular->vagas}}</td>
                            <td >{{ count($cadastros->where('extracurricular_id', $extracurricular->id)) }}</td>
                            <td><a href="{{ route('extracurricular.show',$extracurricular->id)}}" class="btn btn-success"><span class="glyphicon glyphicon-home "></span> Info</a></td>
                            </tr>
                        @endforeach
                        </tbody>

如您所见,计数功能是对一列中的学生人数进行计数,但是如何在更多列中使用它呢?

我尝试过

<td >{{ count($cadastros->where('extracurricular_id', $extracurricular->id)+count($cadastros->where('extracurricular_id2', $extracurricular->id)+count($cadastros->where('extracurricular_id3', $extracurricular->id)+count($cadastros->where('extracurricular_id4', $extracurricular->id))))) }}</td>

但是看起来我不能在集合中使用像这样的计数功能

这是我的模型课:

class Cadastro extends Model
{
    //
    protected $fillable = [
        'cooperado_id',
        'extracurricular_id',
        'extracurricular_id2',
        'extracurricular_id3',
        'extracurricular_id4',
        'dependente',
        'serie',
        'integral'
      ];
}

2 个答案:

答案 0 :(得分:3)

您可以使用orWhere来加入多个OR条件,也可以使用count()来计算结果。

赞:

@php
    $extID = $extracurricular->id; 
    $cadastrosCount = $cadastros->where('extracurricular_id', $extID)
                                 ->orWhere('extracurricular_id2', $extID)
                                 ->orWhere('extracurricular_id3', $extID)
                                 ->orWhere('extracurricular_id4', $extID)
                                 ->count();
@endphp

<td>{{ $cadastrosCount }}<td>

已编辑:

我建议您创建访问器,并将您的querybuilder放在此处,这样您的视图将很干净,您还可以在其他任何地方重复使用它。喜欢:

在模型Extracurricular.php中定义访问器函数,例如getCadastrosCountAttribute,然后在其中添加querybuilder代码,例如:


public function getCadastrosCountAttribute(){
    return Cadastro::where('extracurricular_id', $this->id)
                     ->orWhere('extracurricular_id2', $this->id)
                     ->orWhere('extracurricular_id3', $this->id)
                     ->orWhere('extracurricular_id4', $this->id)
                     ->count();
}

现在在您的视图中,您可以将其用作:

<td>{{ $extracurricular->cadastros_count }}</td>

编辑2:

在访问器函数中,您会对每个课外记录执行多次查询。为避免这种情况,您可以在Model中创建一个简单的函数,该函数接受Cadastro集合并对其进行查询。现在,您已经在控制器中设置了该集合,因此在设置集合时无需花任何时间,只需更改:

赞:

在模型Extracurricular.php

public function getCadastrosCount($cadastros){
    return $cadastros->where('extracurricular_id', $this->id)
                     ->orWhere('extracurricular_id2', $this->id)
                     ->orWhere('extracurricular_id3', $this->id)
                     ->orWhere('extracurricular_id4', $this->id)
                     ->count();
}

现在更改视图,例如:

<td>{{ $extracurricular->getCadastrosCount($cadastros) }}</td>

答案 1 :(得分:0)

您可以使用此:

{{ count($cadastros->where('extracurricular_id', $extracurricular->id)
    ->orWhere('extracurricular_id2', $extracurricular->id)
    ->orWhere('extracurricular_id3', $extracurricular->id)
    ->orWhere('extracurricular_id4', $extracurricular->id))))) }}