在 laravel 中标记多对多关系的更新复选框

问题描述 投票:0回答:1

我正在尝试显示从多对多关系中获取的更新复选框。

型号

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

我需要它显示的图像:

laravel checkbox eloquent many-to-many relationship
1个回答
0
投票

我无法理解 belongsToMany 是否是 CandidatoEstadoPostulacion 之间的正确关系,也许是因为一些翻译问题。 我认为你还应该创建一个模型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' : ''
© www.soinside.com 2019 - 2024. All rights reserved.