2015-07-25 4 views
2

Недавно я столкнулся с проблемой доступа и фильтрации глубоко вложенных отношений, поэтому решил обратиться за помощью.Фильтрация глубоко вложенных отношений

Итак, у меня есть дб структура: http://s21.postimg.org/motrjy3dj/Screenshot_from_2015_07_24_12_14_51.png

И мне нужно, чтобы получить все команды в рамках проекта, а затем для каждой команды мне нужно получить назначенные пользователь (из этой группы).

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

Вот мой код:

$project = Project::with("variants") 
       ->with(array(
         "teams" => function($query) { 

          $query->with(array(

           "users" => function($query) { 

            $query->with("offers"); 
           } 
          )); 

         } 
        )) 
       ->find($projectID); 

У меня есть hasManyThrough отношения «предложения» в модели «User», который возвращает мне все предложения для пользователей, но на самом деле мне просто нужно (один) предложение для соответствующего team_user Таблица.

Я попытался фильтрация предлагает прицелы, но это плохое решение, потому что для каждого пользователя у меня есть дополнительный запрос к БД ..

Есть ли какой-нибудь способ, чтобы фильтровать эти предложения динамически?

Спасибо!

ответ

1

Я настоятельно рекомендую использовать присоединяется к такого рода сложных запросов:

$projectOffers = Project 
    ->join('team', 'team.project_id', '=', 'project.id') 
    ->join('team_user', 'team_user.team_id', '=', 'team.id') 
    ->join('user', 'user.id', '=', 'team_user.user_id') 
    ->join('offer', 'offer.id', '=', 'team_user.offer_id') 
    ->get([ 
     'project.id', 
     'team.id AS team_id', 
     'user.id AS user_id', 
     'offer.id AS offer_id', 
     // any other columns you want 
    ]); 
+0

Ну что обязательно должны работать, но я был отчасти в надежде сохранить все мои запросы под красноречивые ОРМ, так как, как я понял, что это может работать с различными типами баз данных, в отличие от Fluent. –

+0

На самом деле у Джона нет разницы в поддержке базы данных между Eloquent и простым построителем запросов 'DB :: table()'. Они оба используют один и тот же движок внизу, и оба имеют одинаковые запросы. Но я обновил свой ответ на использование Eloquent по запросу. –

Смежные вопросы