我需要计算一门课程记录的学生人数,但是他可以选择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'
];
}
答案 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))))) }}