雄辩的Laravel关系-用户是学生还是老师一对一关系

时间:2019-03-18 09:33:38

标签: php laravel eloquent

使用雄辩有问题。我有一个user表(idnameemailroleid)和另外2个表(studentteacher )。

我想通过user(用户表)和roleiduser_idstudent表)将其连接到teacher表,但是我似乎无法在2个表(学生和教师)有数据时显示/查看。

例如student表有一条记录,而teacher没有表

这是我的用户模型

//User Model
public function student(){
        return $this->hasOne('App\Student','user_id');

    }
    public function teacher(){
        return $this->hasOne('App\Teacher','user_id');
    }



//Student and Teacher Model
    public function user(){
        return $this->belongsTo('App\User','id');
    }



//Teacher Controller
public function teacher(){
        $teachers = Teacher::orderBy('t_fname','asc')->paginate(10);
        $users = User::orderBy('username','asc')->paginate(10);
        //$teachers = Teacher::orderBy('name','asc')->paginate(10);
         return view('usersaccount.teacher', compact('teachers','users'));
    }


//View Teacher
@if (count($teachers)>0)
                        @foreach($users as $user)
                            <tr>
                                <td>{{$user->username}}</td>
                                <td>{{$user->teacher->t_fname}}</td>
                                <td>{{$user->email}}</td>
                                <td>
                                     @if(!Auth::guest())
                                        @if(Auth::user()->id == $user->teacher->created_by)
                                            {!!Form::open(['action'=>['TeacherController@destroy', $user->id], 'method'=>'Post', 'class'=>''])!!}
                                            {{Form::hidden('title',$user->username)}}
                                            {{Form::hidden('desc',$user->email)}}
                                            {{Form::hidden('_method','DELETE')}}
                                            {{Form::button('<i class="fa fa-trash"></i>', ['type' => 'submit', 'class' => 'btn btn-warning btn-sm delete'] )  }}
                                            {{-- {{Form::submit('Delete',['class'=>'btn btn-danger delete'])}} --}}
                                            <a href="/teacher/{{$user->id}}/edit" class="btn btn-primary btn-sm mr-1" data-target=".edit{{$user->id}}" data-toggle="modal"><i class="fas fa-pencil-alt"></i> </a>
                                            {!!Form::close()!!}
                                        @endif
                                    @endif
                                </td>
                                <td>{{$user->email}}</td>
                            </tr>
                        @endforeach
                    @endif

1 个答案:

答案 0 :(得分:1)

如果学生表和教师表中都有数据,则代码不起作用的原因是因为两者都使用了用户数据user_id的相同字段。

根据您的情况设置数据库和模型的正确方法是使用一对一多态关系:https://laravel.com/docs/5.8/eloquent-relationships#polymorphic-relationships

  1. 从教师和学生表格及模型中删除user_id列和关系。
  2. 向用户添加以下列:
$table->unsignedInteger('userable_id');
$table->string('userable_type');
  1. 如下编辑模型:

学生和教师模型:

public function user() {
    return $this->morphOne('App\User', 'userable');
}

用户模型:

public function userable() {
    return $this->morphTo();
}

现在致电$user->userable将返回老师或学生。