Как мне структурировать это отношение «многие-ко-многим-многим» наиболее «красноречивым» способом?

#laravel #eloquent

#laravel #красноречивый

Вопрос:

Я могу представить несколько способов сделать это, но я хочу убедиться, что я делаю все эффективно и оптимизированным для Laravel способом.

У меня есть пользователи и команды. Пользователи могут принадлежать ко многим командам, и, конечно, в команде может быть много пользователей. Типичное отношение «многие-ко-многим»:

 class User extends Authenticatable
{
    public function teams()
    {
        return $this->belongsToMany('AppTeam');
    }
}
  

и,

 class Team extends Model
{
    public function users()
    {
        return $this->belongsToMany('AppUser');
    }
}
  

Я также хочу, чтобы у каждого пользователя был «статус» в каждой команде. Например, «Активный» и «Неактивный».

Должен ли я создать третью таблицу / модель для «Статуса» и настроить сводные данные как для пользователей, так и для команд? Если да, то как мне использовать eloquent для эффективной выборки пользователей с заданным статусом для каждой команды?

Есть ли другой подход, который я должен рассмотреть?

Ответ №1:

Для многих-ко-многим вам, очевидно, требуется промежуточная таблица. team_user будь что будет. И вы можете добавить status столбец в эту таблицу.

 team_id    user_id    status
1          1          Active
2          1          Inactive
....
  

Отношения:

 public function teams()
{
    return $this->belongsToMany('AppTeam')->withPivot('status');
}
public function users()
{
    return $this->belongsToMany('AppUser')->withPivot('status');
}
  

И,

 $users=User::with('teams')->get();
foreach($users as $user)
{
   foreach($user->teams as $team)
   {
        echo $team->pivot->status;
   }
}
  

Вот документ для работы со сводными таблицами

Комментарии:

1. Ах, спасибо, Санзиб. Я не знал, что могу добавить информацию о статусе в саму сводную таблицу. Я попробую это на следующий день и отчитаюсь.

2. Работает отлично. Спасибо!