Итак, я пытаюсь разобраться с полиморфизмом в Laravel.
Я создаю сайт, который имеет 2 разных типа пользователей (рекрутеры, кандидаты)
У них обоих есть некоторые общие детали, которые я создал в пользовательской таблице:
| id | Имя пользователя электронная почта | пароль | detailable_id | detailable_type
Остальные детали будут сильно отличаться, поэтому я подумал, что могу использовать полиморфизм, чтобы помочь мне в этом. поэтому я создал еще 2 таблицы:
Рекрутеры -> содержать реквизиты рекрутера
кандидаты -> содержать конкретные данные кандидата
У меня есть модели для каждого стола
модель пользователя:
class User extends Model implements AuthenticatableContract, CanResetPasswordContract {
use Authenticatable, CanResetPassword;
protected $table = 'users';
protected $fillable = ['username', 'email', 'password'];
protected $hidden = ['password'];
public function detailable()
{
return $this->morphTo();
}
}
Модель кандидата:
class Candidate extends Model {
public function user()
{
return $this->morphOne('App\User', 'detailable');
}
}
Модель рекрутера:
class Recruiter extends Model {
public function user()
{
return $this->morphOne('App\User', 'detailable');
}
}
Так что я сделал это так, как объясняет большинство уроков (большинство объясняет, как комментарии могут быть добавлены к различным объектам)
Это, однако, не работает так, как мне нужно. В этом я могу сделать что-то вроде $user = App\Recruiter::find($recruiter_id)->user
чтобы получить пользователя, если у меня есть идентификатор рекрутера или объект. Но в идеале я хочу сказать: $details = App\User::find('$user_id')->details
или же Auth::user()->details
Я действительно не могу обернуть голову, как бы я сделал эту работу, кто-нибудь может помочь? Или, может быть, скажите мне, что это не может быть сделано
Я чувствую себя довольно глупо, так как я только что нашел ответ в документации Laravels. Вы можете сделать то, что мне нужно, с помощью этой настройки, все, что мне нужно сделать, это набрать Auth::user()->detailable
и это возвращает детали для пользователя
Других решений пока нет …