Eloquent Laravel Relationship - пользователь либо ученик, либо учитель один на один - PullRequest
0 голосов
/ 18 марта 2019

У меня проблемы с использованием eloquent. У меня есть таблица user (id, name, email, roleid) и 2 другие таблицы (student и teacher).

Я хочу подключить его к user таблице через roleid (таблица пользователя) и user_id (student и 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 Ответ

1 голос
/ 18 марта 2019

Причина, по которой ваш код не работает, если у вас есть данные в таблице ученика и учителя, заключается в том, что оба используют одно и то же поле пользовательских данных 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 теперь вернет либо учителя, либо ученика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...