Laravel: как объединить модель в другую модель - PullRequest
1 голос
/ 03 мая 2020

Я использую Люмен для создания API, который должен обрабатывать 2 объекта: Gamemaster и Player. Оба они на самом деле User моего API, так как они должны предоставить токен. Итак, в конце «gamemaster» и «player» - это просто роль «пользователя».

Поэтому я управляю ими, используя 3 модели, которые обрабатывают информацию из базы данных (я упрощаю пример):

  • User:
    • id
    • username
    • email
    • password
  • Gamemaster:
    • user_id (идентификатор пользователя в качестве внешнего ключа)
    • created_games
    • ...
  • Player:
    • user_id (идентификатор пользователя в качестве внешнего ключа)
    • registered_games
    • ...

Итак, мой вопрос: возможно ли объединить модель User в Gamemaster и Player? Так что я могу, например, получить письмо от мастера игры, используя Gamemaster::find($id)->email. Есть ли способ или я должен каждый раз искать в обеих моделях, чтобы получить всю информацию:

$user = User::find($id);
$userAsGamemaster = Gamemaster::where('user_id', '=', $id)->first();

$gamemasterName = $user->username;
$gamemasterEmail = $user->email;
$gamemasterCreatedGame = $userAsGamemaster->created_games;

Ответы [ 2 ]

2 голосов
/ 03 мая 2020

используйте для этого отношения на модели.

Как и в вашем случае, Gamemaster и Player оба принадлежат пользователю, поэтому вы можете определить отношение для модели Gamemaster и Player Model следующим образом: ->

public function user(){
  return this->belongsTo('App\User', 'your_foregin_key', 'Your_local_key');
}

Теперь вы можете получать электронную почту следующим образом: ->

$userAsGamemaster = Gamemaster::where('user_id', '=', $id)->first();
$email = $userAsGamemaster->user->email;

Или используя:

Gamemaster::find($id)->user->email;

Вот и все.

1 голос
/ 03 мая 2020

Хорошо. Я пишу в ответе о том, о чем мы говорили в комментариях.

Не отвечаю на вопрос о слиянии двух моделей, но вы можете достичь того, чего хотите, определяя отношения в своих моделях Gamemaster и Player:

public function user()
{
  return $this->belongsTo(User::class);
}

Итак, если у вас есть идентификатор модели User в переменной $id, вы можете сделать что-то вроде этого:

$gamemaster = Gamemaster::where('user_id', $id)->first();

$gamemasterName = $gamemaster->user->username;
$gamemasterEmail = $gamemaster->user->email;
$gamemasterCreatedGame = $gamemaster->created_games;

А если в переменной $id вы Имея идентификатор модели Gamemaster, вы можете сделать что-то вроде этого:

$gamemaster = Gamemaster::find($id);

$gamemasterName = $gamemaster->user->username;
$gamemasterEmail = $gamemaster->user->email;
$gamemasterCreatedGame = $gamemaster->created_games;

И то же самое для Player.

...