我正在尝试显示从多对多关系中获取的更新复选框。
型号
Candidato
:
public function estados()
{
return $this->belongsToMany(EstadoPostulacion::class, 'candidato_estado_postulacions', 'status_id', 'user_id')->withTimestamps();
}
型号
EstadoPostulacion
public function candidatos()
{
return $this->belongsToMany(Candidato::class, 'candidato_estado_postulacions','user_id', 'status_id')->withTimestamps();
}
型号
CandidatoEstadoPostulacion
public function candidatos()
{
return $this->hasMany(Candidato::class, 'status_id', 'user_id');
}
public function estados()
{
return $this->hasMany(EstadoPostulacion::class, 'id', 'status_id');
}
控制器
Candidatos
public function index( Vacancy $vacante, Candidato $candidato )
{
$estados = EstadoPostulacion::pluck('status', 'id');
$ca = Candidato::with('estados')->get();
return view('candidatos.index', compact('vacante', 'estados', 'candidato') );
}
表
Candidatos
:
id | user_id | 空缺编号 |
---|
表
estado_postulaciones
:
id | 状态 |
---|
表
candidato_estado_postulaciones
:
status_id | user_id | 空缺编号 |
---|
查看
candidatos/index.blade.php
@forelse ($estados as $id => $estado)
<div>
<input type="checkbox" name="status[]" id="{{ $estado }}-{{ $candidato->user_id }}" class="peer hidden" value="{{ $id }}" {{ $candidato->estados->contains($id) ? 'checked' : '' }} onchange="this.form.submit()">
<label for="{{ $estado }}-{{ $candidato->user_id }}" class="block cursor-pointer select-none rounded-xl p-2 text-center peer-checked:bg-blue-500 peer-checked:font-bold peer-checked:text-white">
<i class="fas fa-folder fa-2x"></i>
<div class="w-full text-xs">Está en:</div>
<div class="w-full text-xs text-gray-800 font-semibold uppercase">{{ $estado }}</div>
</label>
</div>
@empty
<li>No existe ningun estado en la BD</li>
@endforelse
我无法理解 belongsToMany 是否是 Candidato 和 EstadoPostulacion 之间的正确关系,也许是因为一些翻译问题。 我认为你还应该创建一个模型Status和一个表statuses,所以,而不是
$estados = EstadoPostulacion::pluck('status', 'id');
你可以用Status::all()
(或类似的东西)获得状态。
您的具体问题是您在视图中使用了
$candidato->estados->contains($id) ? 'checked' : ''
,但是由于 estados 是一个 belongsToMany 关系,它返回一个包含模型的 集合 因此它永远不会包含等于 $id 的元素并且表达式将永远是false。
另请注意,类模型不拥有称为contains()
.的方法
无论如何,我认为最接近你想要的东西是这样的:
$candidato->estados()->whereId($id)->exists() ? 'checked' : ''
考虑到@miken32 的评论,一个更好的选择可能是在 estados 集合上使用 where 过滤器:
$candidato->estados->where('id', $id)->count() ? 'checked' : ''