#php #laravel-5
#php #laravel-5
Вопрос:
Администратор приложения имеет доступ к списку всех проектов пользователя. Напишите, теперь я могу перечислить проекты, но все они перечислены вместе, независимо от уникального идентификатора URL.
// Admin form case controller
public function adminforms (Project $project){
$users = User::get();
return view('smiledesign.adminforms', compact('users', 'project'));
}
///Records controller
public function records(user $users, project $project){
$project = project::get();
$users = user::get();
return view ('/smiledesign/records' , compact( 'users','project'));
}
<table class="table">
<thead>
<tr>
<th>Dr Name</th>
<th>User Id</th>
<th>Email</th>
</tr>
</thead>
<tbody>
@foreach ($users as $user)
<tr>
<td> <a href="/smiledesign/{{$user->id}}/records">{{$user->name}}</a></td>
<td> <a href="/smiledesign/{{$user->id}}/records">{{$user->id}}</a></td>
<td> <a href="/smiledesign/{{$user->id}}/records">{{$user->email}}</a></td>
</tr>
</tbody>
@endforeach
</table>
// Records view
<table class="table table-striped table-bordered" id="table_id">
<thead>
<tr>
<th>Case Number</th>
<th>Case Form</th>
<th>Patient Name</th>
<th>Date Created</th>
<th>Status</th>
</tr>
</thead>
@foreach ($project as $project)
<tbody>
<tr>
<td> <a href="/smiledesign/{{$project->id}}/show">{{$project->case_number}}</a></td>
@if ($project->services0)
<td> <a href="/smiledesign/{{$project->id}}/show">{{$project->services0}}</a></td>
@elseif ($project->services1)
<td> <a href="/smiledesign/{{$project->id}}/show">{{$project->services1}}</a></td>
@elseif ($project->services2)
{{-- <td> <a href="/smiledesign/{{$project->id}}/show">{{$project->services2 . ' ' . $project->mockup0}}</a></td> --}}
<td> <a href="/smiledesign/{{$project->id}}/show">{{$project->services2 . ' ' . $project->mockup0 . ' ' . $project->mockup1}}</a></td>
@endif
<td> <a href="/smiledesign/{{$project->id}}/show">{{$project->first_name . ' ' . $project->last_name}}</a></td>
<td> <a href="/smiledesign/{{$project->id}}/show">{{$project->created_at}}</a></td>
<td> <a href="/smiledesign/{{$project->id}}/show">{{$project->concerns}}</a></td>
</tr>
</tbody>
@endforeach
</table>
То, что я хочу видеть, — это каждый проект конкретного пользователя, когда я нажимаю на ссылку от пользователя adminforms. Вместо этого по каждой ссылке, по которой я перехожу, я вижу все проекты всех пользователей
Ответ №1:
Взаимосвязь между проектами и пользователями должна быть определена в базе данных и в самих моделях.
База данных:
В моей интерпретации пользователь может работать над несколькими проектами, и в проекте может быть несколько пользователей, это было бы отношением «многие ко многим». С этим выводом я бы выбрал настройку абстрактной таблицы следующим образом:
- в таблице users есть поле id.
- в таблице projects есть поле id.
- таблица project_users содержит поле id (всегда обязательное для laravel), поле user_id (внешний ключ для users.id ) и поле project_id (внешний ключ к projects.id ). Не забудьте добавить уникальный ключ, который объединяет user_id и project 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;
}
}
Боковое примечание
Мои инструкции оптимизированы для производительности. Вы также могли бы просто вызвать ->projects
на $user
, не используя with('projects')
в запросе, но это будет означать, что вы вызовете запрос на месте. Поскольку этот тип кода склонен к использованию в foreach
операторах, вы могли бы выполнять запросы в foreach
операторах, что связано с проблемой запроса N 1.