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

Laravel下拉框数据传递异常:读取字符串属性'id'报错求助

问题描述

在Laravel中创建下拉框,从数据库获取数据填充时遇到错误:

Attempt to read property "id" on string

以下是相关代码:

Batch模型

class Batch extends Model
{
    protected $table = 'batches';
    protected $primaryKey = 'id';
    protected $fillable = ['name', 'course_id', 'start_date'];
    use HasFactory;

    public function course()
    {
        return $this->belongsTo(Course::class);
    }
}

Batch控制器

public function create(): View
{
    $courses = Course::pluck('name','id');
    return view('batches.create', compact('courses'));
}

批次视图

<select name="course_id" id="course_id" class="form-control">
 @foreach($courses as $item)
<option value="{{ $item->id }}">{{ $item->name}}</option>
 @endforeach
错误原因

控制器中pluck('name','id')返回的是键为课程id、值为课程名称的集合,结构类似[1 => 'PHP开发', 2 => 'Java进阶']。但视图里错误地将循环变量$item当成Course对象,试图访问它的id和name属性——实际上$item是字符串类型的课程名称,因此触发“Attempt to read property "id" on string”错误。

解决方案

有两种可行的修复方案,任选其一即可:

方案一:适配pluck返回的集合结构修改视图

直接利用集合的键值对结构,循环时分别获取id和名称:

<select name="course_id" id="course_id" class="form-control">
 @foreach($courses as $id => $name)
<option value="{{ $id }}">{{ $name}}</option>
 @endforeach
</select>

方案二:修改控制器获取完整对象集合

如果后续需要在视图中使用Course对象的其他属性,可以直接获取所有Course记录:

public function create(): View
{
    $courses = Course::all();
    return view('batches.create', compact('courses'));
}

此时视图代码保持你原来的写法即可(注意补全闭合的</select>标签):

<select name="course_id" id="course_id" class="form-control">
 @foreach($courses as $item)
<option value="{{ $item->id }}">{{ $item->name}}</option>
 @endforeach
</select>

内容的提问来源于stack exchange,提问作者John Peter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:32:12