Laravel 5 — Красноречивая связь

#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>';
  

Приведенный выше код сгенерировал этот вывод для меня:

введите описание изображения здесь