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

Laravel 7一对一关联下拉列表如何仅展示未关联书籍?

实现Laravel7一对一关联下未关联学生的书籍下拉列表

问题分析

你当前的代码存在两个核心问题:

  1. 控制器查询了所有书籍,未提前筛选未关联数据,反而在视图中做了错误判断
  2. 视图中的@if($book->students->book_id == $book->id)逻辑完全错误,且当书籍未关联学生时,$book->students会返回null,直接访问book_id会抛出报错

解决方案

1. 修改Student控制器的create方法

直接通过Eloquent的whereDoesntHave方法筛选出未关联任何学生的书籍,避免在视图中处理复杂逻辑,同时提升查询效率:

public function create()
{
    // 筛选出没有关联学生的书籍
    $books = Book::whereDoesntHave('students')->get();
    return view('students.create', compact('books'));
}

注:原代码中的$students变量在创建页面未被使用,可直接移除

2. 修改视图代码

直接遍历已筛选好的书籍列表即可,无需额外判断:

<div class="form-group">
    <div class="col-md-6 col-sm-6 col-xs-12">
        <label class="control-label col-md-3 col-sm-3 col-xs-12" for="book">Book <span class="required">*</span></label>
        
        <select class="form-select" style="color: #41A7A5" aria-label="Default select example" name="book">
            <option value="">Select Book</option>
            @foreach ($books as $book)
                <option value="{{ $book->id }}">{{ $book->name }}</option>  
            @endforeach
        </select>
    </div>
</div>

3. 确认模型关联正确性

你的Book和Student模型的一对一关联配置正确,无需修改:
Book模型

class Book extends Model
{
    protected $fillable = ['name','description'];
    
    public function students(): HasOne
    {
        return $this->hasOne(Student::class, 'book_id', 'id');
    }
}

Student模型

class Student extends Model
{
    protected $fillable = ['book_id','name'];

    public function books()
    {
        return $this->belongsTo(Book::class, 'book_id');
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:45:22