php LARAVEL 7一对一关系下拉列表仅显示没有关系的项目

ss2ws0br  于 2023-05-05  发布在  PHP
关注(0)|答案(1)|浏览(127)

我正在使用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');
}}
igetnqfo

igetnqfo1#

在您的Book模型上,您可以使用doesntHave()函数过滤出包含相关学生的书籍,而不是使用all()函数。
该函数将关系作为参数,并返回与该关系没有任何相关模型的所有模型。
请注意,由于我们在查询中添加了一个条件,所以我们需要使用get()而不是all()

public function create(){
    $students = Student::query()->with('books')->latest();
    
    // retrieve all the book without a student related to it
    $books = Book::doesntHave('students')->get();

    return view('students.create',compact('students','books'));
 }

附带说明一下,由于您正在<->StudentBook模型之间创建一个0,1 0,1关系,因此您可能希望重命名bookstudent的相应关系。否则,当稍后返回代码时可能会变得混乱。

相关问题