У меня есть 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