You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel多对多关系下,如何在编辑页传递关联数据到视图?

解决方案

1. 控制器修改(获取关联数据与可选选项)

在edit方法中,你需要预加载当前turno关联的dias数据,同时获取所有可选的dias选项,再提取已关联项的ID用于前端回显选中状态:

public function edit(Turno $turno)
{
    // 预加载关联的dias,避免N+1查询
    $turno->load('dias');
    
    // 获取所有可选择的dias数据
    $todosLosDias = Dia::all();
    
    // 提取已关联的dias的ID集合
    $diasAsociadosIds = $turno->dias->pluck('id');

    return Inertia::render('Turnos/Editar', [
        'turno' => $turno,
        'todosLosDias' => $todosLosDias,
        'diasAsociadosIds' => $diasAsociadosIds,
    ]);
}

2. 前端Inertia视图(多选表单实现)

以Vue组件为例,利用v-model绑定已关联的ID集合,实现多选下拉框的默认选中与编辑:

<template>
  <div class="edit-turno">
    <h2>Editar Turno</h2>
    <form @submit.prevent="guardarCambios">
      <!-- 其他Turno字段的输入框 -->
      <div class="form-group">
        <label for="dias">Días Asociados</label>
        <select 
          id="dias" 
          multiple 
          v-model="form.diasAsociadosIds"
          class="form-control"
        >
          <option 
            v-for="dia in todosLosDias" 
            :key="dia.id" 
            :value="dia.id"
          >
            {{ dia.nombre }} <!-- 替换为Dia模型的实际显示字段 -->
          </option>
        </select>
      </div>
      <button type="submit" class="btn btn-primary">Guardar Cambios</button>
    </form>
  </div>
</template>

<script setup>
import { useForm } from '@inertiajs/vue3';

const props = defineProps({
  turno: Object,
  todosLosDias: Array,
  diasAsociadosIds: Array,
});

// 初始化表单数据,包含已关联的dias ID
const form = useForm({
  // 复制turno的其他字段到表单
  ...props.turno,
  diasAsociadosIds: props.diasAsociadosIds,
});

const guardarCambios = () => {
  form.put(route('turnos.update', props.turno.id), {
    onSuccess: () => {
      // 成功后可跳转到列表页或其他页面
      router.push({ name: 'turnos.index' });
    },
  });
};
</script>

3. 更新方法处理关联关系

在update方法中,使用sync方法同步turno与dias的关联,该方法会自动添加新选中的项、移除未选中的项:

public function update(Request $request, Turno $turno)
{
    // 表单验证
    $validated = $request->validate([
        // 添加其他turno字段的验证规则
        'diasAsociadosIds' => 'array',
        'diasAsociadosIds.*' => 'exists:dias,id',
    ]);

    // 更新turno的基本字段
    $turno->update($validated);
    
    // 同步dias关联
    $turno->dias()->sync($request->diasAsociadosIds);

    return redirect()->route('turnos.index');
}

内容的提问来源于stack exchange,提问作者Ubaldo Villaba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:50:27