Laravel ManyToMany Multiple

У меня есть 3 модели: User , Role , Tool где каждый пользователь может иметь много ролей, и каждая роль может иметь много инструментов.

От многих до многих отношений хорошо работают в каждом случае. Я могу получить доступ:

 User::find(1)->roles Tool::find(1)->roles Role::find(1)->tools Role::find(1)->users 

Мои таблицы:

 users id name roles id name tools is name role_user id role_id user_id role_tool id role_id tool_id 

В каждой модели:

 //In User Model public function roles() { return $this->belongsToMany('Rol'); } //In Role Model public function users() { return $this->belongsToMany('User'); } public function tools() { return $this->belongsToMany('Tool'); } //In Tool Model public function roles() { return $this->belongsToMany('Rol'); } 

Мне нужно получить все инструменты одного пользователя, например: User::find(1)->roles()->tools . Как я могу это сделать?

Получите все роли пользователя, затем в цикле вы получите все инструменты этой роли и объедините их в массив, в котором хранятся все инструменты.

 $tools = array(); foreach(User::find(1)->roles as $role) $tools = array_merge($tools, $role->tools->toArray()); 

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

 $tools = array(); foreach (User::find(1)->load('roles.tools')->roles as $role) { $tools = array_merge($tools, $role->tools->toArray()); } 

Теперь вы можете поместить это в функцию User tools() в вашей модели User .

 public function tools() { $tools = array(); foreach ($this->load('roles.tools')->roles as $role) { $tools = array_merge($tools, $role->tools->toArray()); } return $tools; } 

Вы можете вызвать его так: User::find(1)->tools() .

Я не думаю, что структура имеет лучшее решение. Еще один метод заключается в использовании Fluent Query Builder и создании собственного запроса, но я не вижу, как это будет лучше.

Определить отношения hasManyThrough в User :: find (1) -> role () -> tools

 class User extends Eloquent { public function tools() { return $this->hasManyThrough('Tool', 'Role'); } } 

Затем вы можете получить доступ прямо вперед:

 $user->tools