Отношения между проектами и пользователями должны быть определены в базе данных и в самих моделях.
База данных:
В моей интерпретации, пользователь может работать над несколькими проектами, а проект может иметь несколько пользователей, это будет отношение многих ко многим. С этим выводом я хотел бы перейти к настройке абстрактной таблицы следующим образом:
- Таблица пользователей имеет поле идентификатора.
- таблица проектов имеет поле id.
- таблица project_users имеет поле id (всегда обязательное для laravel), поле user_id (внешний ключ для users.id) и поле project_id (внешний ключ к projects.id). Не забудьте добавить уникальный ключ, который сочетает в себе user_id и идентификатор проекта, нет необходимости дублировать определения.
Модельные отношения:
Проект
function users()
{
$this->belongsToMany(User::class, 'project_users', 'project_id', 'user_id');
}
Пользователь
function projects()
{
$this->belongsToMany(Project::class, 'project_users', 'user_id', 'project_id');
}
Если вы прочитаете эту часть документации , все это будет иметь смысл.
Запрос
$users = User::with('projects')->get();
или
$projects = Project:with('users')->get();
Теперь у каждого пользовательского экземпляра есть коллекция проектов. Если это не так, вам нужно добавить в базу данных запись, связывающую проект с этим пользователем.
Отображение результатов
foreach($users as $user)
{
foreach($user->projects as $project)
{
echo "$user->name works on project $project->name" . PHP_EOL;
}
}
или
foreach($projects as $project)
{
foreach($project->users as $user)
{
echo "$user->name works on project $project->name" . PHP_EOL;
}
}
Sidenote
Мои инструкции оптимизированы для производительности. Вы также можете просто позвонить ->projects
на $user
, не используя with('projects')
в запросе, но это будет означать, что вы запустите запрос на месте. Поскольку этот тип кода склонен к использованию в операторах foreach
, вы можете выполнять запросы в операторах foreach
, что относится к проблеме N + 1 запроса .