我有两个模型,一个是Employees,另一个是Skill。一个员工可以拥有多种技能。现在,我试图在技能视图页面中显示拥有每项连续技能的员工数量。
我的技能视图页面:
<tbody>
@foreach ($skills as $skill)
<tr>
<th scope="row">{{ $loop->index+1 }}</th>
<td>{{ $skill->skill_name }}</td>
<td>{{ $skill->totalEmp($skill->id) }}</td>
<td style="width: 25%;">
<button class="btn btn-outline-danger" type="button" title="Delete Skill">Delete Skill</button>
</td>
</tr>
@endforeach
</tbody>
技能模型:
class Skill extends Model
{
use HasFactory;
protected $fillable = [
'skill_name'
];
public function Employee()
{
return $this->hasMany(Employees::class, 'skill_id', 'id');
}
public function totalEmp($id){
return Employees::where('status', 1)->where('skill_id','=',$id)->count();
}
}
员工模式:
class Employees extends Model
{使用HasFactory;
protected $guarded = [];
protected $table = 'employees';
public function Skills(){
return $this->hasMany(Skill::class);
}
}
员工表具有->skill_id,其他不敬字段||技能模型有->id和skill_name字段。
您可以为此使用withCount
方法。
https://laravel.com/docs/9.x/eloquent-relationships#counting-相关型号
在您的Skill
模型上,您定义了Employee
关系。
所以你可以做这样的事情:
$skills = Skill::withCount(['Employee'])->get();
// Prints out number of employees that posses first skill
echo $skills[0]->employee_count;
当然,您可以使用for
循环迭代$skills
,或者foreach
和类似的循环,甚至可以使用集合方法。
<tbody>
@foreach ($skills as $skill)
<tr>
<th scope="row">{{ $loop->index+1 }}</th>
<td>{{ $skill->skill_name }}</td>
<td>{{ $skill->employee_count }}</td>
<td style="width: 25%;">
<button class="btn btn-outline-danger" type="button" title="Delete Skill">Delete Skill</button>
</td>
</tr>
@endforeach
</tbody>
如果你仍然想使用你的方法totalEmp
,你可以这样修改:
public function totalEmp(){
return $this->employee()->count();
}
我强烈建议的另一件事是确保你正确地命名你的模特和关系。
模型的名称应类似于:Skill
和Employee
关系应命名为:employees()
和skills()
请参阅此处的示例:https://laravel.com/docs/9.x/eloquent-relationships#many-到许多