Laravel 7一对一关联下拉列表如何仅展示未关联书籍?
实现Laravel7一对一关联下未关联学生的书籍下拉列表
问题分析
你当前的代码存在两个核心问题:
- 控制器查询了所有书籍,未提前筛选未关联数据,反而在视图中做了错误判断
- 视图中的
@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
相关产品推荐
相关产品推荐

