2015-05-21 7 views
0

Имея недостаток мозга с отношением между тремя объектами, надеясь, что кто-то может мне помочь.Трехсторонние отношения в Ларавеле

У меня есть четыре модели: Team, User, ProjectType и Project

  • Team имеет много User, имеет много ProjectType
  • User принадлежит ко многому Team, имеет много ProjectType
  • ProjectType принадлежит многие User , принадлежит многим Team, имеет много Project
  • Project принадлежит ProjectType

Как один пользователь может принадлежать многим командам, я хочу просить ProjectTypes что User имеет доступ, но только в пределах Team они в настоящее время вошли в систему с. Может быть, User имеет доступ к типам проектов в нескольких командах, но будет входить только в одну команду в любое время, поэтому мне нужно только это подмножество.

Я надеюсь, что эта структура имеет смысл, но я изо всех сил, чтобы получить доступ к данным, я хочу легко

Так что я хотел бы сделать $user->projectTypes и получить все типы проектов для этого пользователя, но только подмножество команды, с которой они в настоящее время вошли в систему.

Точно так же, как только у меня это получилось, я хочу получить $user->projectTypes->projects внутри этого набора.

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

Стоит добавить, что я использую Laravel 4.2, но я его не отделяю, и при необходимости можно обновить до 5.x, чтобы получить эту функциональность.

+0

Отъезд областей запроса Laravel в. Я использовал их для чего-то очень похожего. Вместо того, чтобы просто работать с отношениями, вы «предварительно» фильтруете результаты запроса $ user, чтобы показывать только те, которые связаны с teamId. – retrograde

ответ

0

Как только вы описали, вы можете получить доступ к ProjectTypes, принадлежащим пользователю, которые также принадлежат определенной команде (в вашем случае $teamid должен быть идентификатором команды, в которой пользователь в настоящее время войти в систему) следующим образом:

$projectTypes = $user->projectTypes()->where('team_id', $teamid)->get(); 

чтобы легко получить доступ к коллекции всех проектов, которые принадлежат все ProjectTypes, которые принадлежат пользователю, вы бы сначала определить the HasManyThrough relationship так:

class User extends Eloquent { 

    public function projects() 
    { 
     return $this->hasManyThrough('Project', 'ProjectType'); 
    } 

} 

Тогда вы можете получить доступ к этой коллекции, как так:

$projects = $user->projects; 

и, наконец, доступ к проектам, которые принадлежат к ProjectTypes, которые принадлежат пользователю, которые также принадлежат к определенной команде (т.е.то, что кажется, что вы ищете), вы можете использовать lists(), чтобы получить список соответствующих ProjectType идентификаторов, а затем whereIn() фильтровать для тех, кто находится в этом списке:

$projectTypeIds = $user->projectTypes()->where('team_id', $teamid)->lists('id'); 
$projects = $user->projects()->whereIn('projecttype_id', $projectTypeIds)->get(); 
+0

Это сделало именно то, что я хотел, спасибо - изначально я пытался избежать использования каких-либо 'whereIn()' (избегая требования предварительно сделать запрос, чтобы получить этот массив), но я думаю, что на данный момент это лучшее решение! – Htch

+0

Рад, что помогло. В любом случае Laravel выполняет несколько запросов SQL для каждого запроса Eloquent, поэтому отдельный запрос Eloquent для получения массива идентификаторов заранее, вероятно, не будет иметь никаких реальных недостатков с точки зрения производительности по сравнению с любым другим возможным решением. –

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