Итак, я понимаю, как загрузить роли для пользователя и разрешения для роли.
Но теперь у меня есть user
стол, role
стол и permission
Таблица. у меня тоже есть role_user
таблица для связи пользователей и ролей. И конечно permission_role
для связывания разрешений и ролей.
Теперь, когда я хочу получить все роли для пользователя, я просто делаю что-то вроде этого:
public function roles()
{
return $this->belongsToMany('Uppdragshuset\AO\Tenant\Models\Role');
}
Точно так же я могу получить разрешения для ролей следующим образом:
public function permissions()
{
return $this->belongsToMany(Permission::class);
}
Теперь, согласно документации по laravel, я могу напрямую получать разрешения для пользователя, используя отношение hasManyThrough, например, так:
public function permissions()
{
return $this->hasManyThrough(Permission::class, Role::class);
}
Но это возвращается с ошибкой, говорящей:
Неизвестный столбец ‘role.user_id’ в ‘списке полей’
Я думаю, что понимаю почему. Laravel ищет user_id
поле в role
таблица, но он не понимает, что это отношение многие ко многим, и он должен искать его в сводной таблице.
Так как же обойти это? Есть ли способ обойти это в Eloquent или мне придется прибегнуть к помощи построителя запросов? И если да, как сделать то же самое с построителем запросов?
HasManyThrough
может использоваться только для соединения двух HasMany
отношения. Для вашего случая нет родных отношений.
Я создал HasManyThrough
отношения с неограниченным уровнем и поддержкой BelongsToMany
:
Репозиторий на GitHub
После установки вы можете использовать его так:
class User extends Model {
use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
public function permissions() {
return $this->hasManyDeep(Permission::class, ['role_user', Role::class, 'permission_role']);
}
}
Других решений пока нет …