#laravel #laravel-5 #model #eloquent #relationship
#laravel #laravel-5 #Модель #красноречивый #отношения
Вопрос:
У меня есть три таблицы, как показано ниже:
------------------------------
| users | projects | clients |
|--------|-----------|-------- |
| id | id | id |
| name | client_id | name |
| | user_id | |
| | name | |
------------------------------
Итак, в основном отношения похожи:
У пользователя есть много проектов
, проект принадлежит клиенту
Мой вопрос:
Как я могу получить всех клиентов пользователя, используя eloquent?
Похоже, я не могу использовать метод manythrough, поскольку в таблице клиентов нет project_id.
Итак, чего я хочу добиться, так это :
foreach($users as $user)
foreach($user->clients as $client) //HOW TO SET UP THIS RELATION?
foreach($client->projects($user)->get() as $project)
Комментарии:
1. у вас должна быть связь между пользовательской и проектной моделями в laravel
2. Я знаю, что мог бы напрямую получать пользовательские проекты (у пользователя есть много проектов), но я хочу получить их через клиентскую модель, что означает, что даже клиент не принадлежит пользователю, если проект клиента принадлежит пользователю, тогда пользователь может получитьПроект через клиента.
3. Вы пробовали
hasManyThrough
отношения?4. @JamalAbdulNasir На данный момент отношение похоже
User hasMany Projects, Project belongsTo Client
, я думаюhasManyThrough
, применимо только к отношению один ко многим, посколькуproject_id
вClient
таблице их нет.5. и какова реализация проектов для пользователей?
Ответ №1:
$users = User::with('projects')->get();
// organize cleints' project and add for each user
foreach ($users as $user) {
// order projects by client_id
$projects = Collect($user->projects->toArray());
$clients = $projects->groupBy('client_id');
// keep projects data in 'projects' index
$temp = array();
foreach($clients as $client => $projects){
$temp[$client] = array('projects' => $projects);
}
// add clinets data for each user
$user['clients'] = $temp;
}
// output
foreach($users as $user)
foreach($user->clients as $client)
foreach($client['projects'] as $project)
echo 'user-'.$project['user_id'].', clinet-'.$project['client_id'].', project-'.$project['name'].'<br>';
Приведенный выше код сгенерировал этот вывод для меня: