У меня есть сообщения и пользователи, которым я назначаю одну или несколько ролей. Роли у пользователей и сообщений одинаковы, поэтому я могу их сравнить.
Для назначения ролей я использую библиотеку spatie / laravel -permissions .
Я строю API. Я использую ресурсы Laravel.
Мне бы хотелось, чтобы сообщения с ролью "admin" могли отображаться только для пользователей с ролью "admin".
В настоящее время я не могу.
CategoryController
$categorie = Category::where('slug->' . auth()->user()->lang, $slug)
->with(['posts' => function ($query) {
$query->published();
}])->first();
return new CategoryResource($categorie);
Мой класс PostResource PostResource расширяет JsonResource
{
public function toArray($request)
{
return [
'title' => $this->title,
'slug' => $this->slug,
'content' => $this->content,
'image' => $this->image,
'status' => $this->status,
'date' => $this->date,
'roles' => $this->roles
];
}
}
Мой CategoryResource
class CategoryResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'slug' => $this->slug,
'posts' => PostResource::collection($this->whenLoaded('posts')),
'count_posts' => $this->posts->where('status', 'published')->count(),
//'has_new_posts' => $this->has_new_post
];
}
}
Возможно ли управлять этим напрямую через ресурсы ? Или с помощью красноречивого запроса
Лично я пробовал другой подход в контроллере, но я не нахожу его хорошим, и, кроме того, у меня есть массив вместо объекта, который мне не подходит.
$categorie = Category::where('slug->' . auth()->user()->lang, $slug)
->with(['posts' => function ($query) {
$query->published();
}])->first();
$posts = $categorie->posts;
$postsWithGoodRole = [];
foreach ($posts as $post) {
if ($post->hasAnyRole(Auth::user()->roles)) {
array_push($postsWithGoodRole, $post);
}
}
return response()->json([
'posts' => $posts
]);