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

如何在Laravel的Blade模板中显示外键ID?

问题分析与解决方案

你的核心问题出在关联关系设计错误以及数据库结构不匹配需求,导致无法正确获取关联数据。以下是分步修正方案:

1. 修正数据库结构(适配多对多关联)

你的视图使用多选框,说明一个老师可以教授多个级别,这属于多对多关系,而非当前的一对多/一对一结构。需要创建中间表维护关联:

创建teacher_level中间表迁移

public function up()
{
    Schema::create('teacher_level', function (Blueprint $table) {
        $table->id();
        $table->unsignedBigInteger('teacher_id');
        $table->unsignedBigInteger('level_id');
        $table->foreign('teacher_id')->references('id')->on('teachers')->onDelete('cascade');
        $table->foreign('level_id')->references('id')->on('levels')->onDelete('cascade');
        $table->unique(['teacher_id', 'level_id']); // 避免重复关联
    });
}

同时删除teachers表中的levels_id字段(多对多关系不需要单个外键字段):

// 修改teachers表迁移文件,移除以下两行
$table->unsignedbiginteger('levels_id');
$table->foreign('levels_id')->references('id')->on('levels');

2. 修正模型关联关系

Teacher.php模型

class Teacher extends Model { // 注意:原代码写错了,是Model而非Models

    protected $fillable = [
        'teacher_name',
        'teacher_email',
        'teacher_home_phone',
        'teacher_work_phone',
        'teacher_mobile_phone',
        'teacher_home_address',
        'teacher_suburb',
        'teacher_postcode',
        'teacher_username',
        'teacher_password',
        // 移除levels_id字段,多对多不需要该字段
    ];

    // 一个老师对应多个级别,多对多关联
    public function levels()
    {
        return $this->belongsToMany(Level::class, 'teacher_level'); // 指定中间表名称
    }               
}

Level.php模型(建议类名用单数Level,符合Laravel规范)

class Level extends Model
{
    use HasFactory;

    protected $fillable = [
        'levels_name', // 移除levels_id,主键为id
    ];

    // 一个级别对应多个老师,多对多关联
    public function teachers()
    {
         return $this->belongsToMany(Teacher::class, 'teacher_level');
    }
}

3. 存储老师与级别的关联数据

在控制器的存储/更新方法中,处理多选框提交的levels_id数组:

// 存储老师数据
$teacher = Teacher::create($request->except('levels_id'));
// 关联选中的级别
$teacher->levels()->attach($request->levels_id);

// 更新老师数据
$teacher->update($request->except('levels_id'));
// 同步关联(先移除旧关联,再添加新关联)
$teacher->levels()->sync($request->levels_id);

4. 获取关联数据并在视图中展示

获取老师的所有级别

// 控制器中查询老师并预加载关联级别,避免N+1查询
$teacher = Teacher::with('levels')->find($id);
// 传递到视图
return view('teachers.show', compact('teacher'));

// 在视图中遍历展示级别
@foreach($teacher->levels as $level)
    <p>{{ $level->levels_name }}</p>
@endforeach

修正视图中的回显逻辑

当前视图直接调用$teacher->levels_id错误,应检查老师关联的级别ID:

<div class="form-group col-md-5">
    <label for="Teacher_Name" class="required">选择讲师教授的级别</label>
    <div class="col-md-12">
        <!-- Level 1复选框示例 -->
        <div class="form-check form-check-inline col-md-3">
            <input class="form-check-input" type="checkbox" name="levels_id[]" value="1" 
                @if(isset($teacher) && $teacher->levels->pluck('id')->contains(1)) checked @endif>
            <label class="form-check-label">Level 1</label>
        </div>
        <!-- 其他级别同理,value需对应levels表中的id值,而非名称 -->
    </div>
</div>

关键注意点

  • Laravel模型命名规范:类名用单数(Level而非Levels),关联方法名用复数
  • 多对多关系必须使用中间表,表名遵循「单数模型名_单数模型名」的顺序
  • 存储关联用attach(新增)或sync(同步,适合更新场景)
  • 获取关联数据时,使用with()预加载可避免N+1查询问题

内容的提问来源于stack exchange,提问作者Muhammad Omer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:24:27