1. Czy da się to połączyć wszystko w jednym zapytaniu "User?
User::find($id)->with('role.permissions')->get();
Musisz mieć utworzone relacje Eloquentowe w modelach:
User.php
public function role() {
return $this->belongsTo(Role::class);
}
Role.php
public function users() {
return $this->hasMany(User::class);
}
public function permissions() {
return $this->belongsToMany(Permission::class);
}
Permission.php
public function roles() {
return $this->belongsToMany(Role::class);
}
Dodatkowo twórz relacje obustronne. Dla przykładu użytkownik posiada wiele postów, post ma tylko jednego użytkownika ( autora ). To w obu modelach powinieneś utworzyć odpowiednie metody.
User.php:
public function posts() {
return $this->hasMany(Post::class);
}
Post.php:
public function user() {
return $this->belongsTo(User::class);
}
A tu przykładowy wynik zapytania w JSONie ( już nie chciało mi się usuwać timestampów ;) ):
[
{
"id":1,
"name":"Pawe\u0142",
"email":"pawel@gmail.com",
"role_id":1,
"created_at":null,
"updated_at":null,
"role":{
"id":1,
"role":"admin",
"created_at":null,
"updated_at":null,
"permissions":[
{
"id":1,
"name":"add",
"created_at":null,
"updated_at":null,
"pivot":{
"role_id":1,
"permission_id":1
}
},
{
"id":2,
"name":"delete",
"created_at":null,
"updated_at":null,
"pivot":{
"role_id":1,
"permission_id":2
}
},
{
"id":3,
"name":"edit",
"created_at":null,
"updated_at":null,
"pivot":{
"role_id":1,
"permission_id":3
}
}
]
}
}
]
2. Czy w tym zapytaniu "Role::find($user->role->id)->getPermissions;", można dokonać sprawdzenia czy permission o danym name istnieje?
Nie do końca rozumiem zamysł. Jedyne co mi teraz przychodzi do głowy i może trochę nakieruje to:
Role::whereHas('permissions', function($query) {
$query->where('name', 'add');
})->get();
To zwróci kolekcję ról, która posiada uprawnienia do dodawania ( add ).