我正在使用Laravel 7并创建一个下拉列表,在那里书应该只显示与学生无关的项目,因为我正在创建一个一对一的关系。我该怎么做?
创建视图
<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)
@if($book->students->book_id == $book->id)
<option name="book" value="{{$book->id}}">{{$book->name}}</option>
@endif
@endforeach
</select>
</div>
</div>
学生控制器-创建
public function create(){
$students = Student::query()->with('books')->latest();
$books = Book::all();
return view('students.create',compact('students','books'));
}
图书型号
class Book extends Model{
protected $fillable = [
'name','description'
];
public function students(): HasOne
{
return $this->hasOne(Student::class, 'book_id', 'id');
}}
学生模型
class Student extends Model
{
protected $fillable = [
'book_id','name'
];
public function books(){
return $this->belongsTo(Book::class, 'book_id');
}}
1条答案
按热度按时间igetnqfo1#
在您的
Book
模型上,您可以使用doesntHave()
函数过滤出包含相关学生的书籍,而不是使用all()
函数。该函数将关系作为参数,并返回与该关系没有任何相关模型的所有模型。
请注意,由于我们在查询中添加了一个条件,所以我们需要使用
get()
而不是all()
。附带说明一下,由于您正在<->
Student
和Book
模型之间创建一个0,1 0,1关系,因此您可能希望重命名book
和student
的相应关系。否则,当稍后返回代码时可能会变得混乱。