Я пытаюсь отобразить списки продуктов нескольких владельцев по одному и тому же маршруту. Например, мой маршрут:
http://example.com/store/public/products
NB: я не хочу указывать id
в маршруте.
Теперь у меня пять столов. Они такие,
таблица пользователей
+----+---------+------+-------+----------+
| id | role_id | name | email | password |
+----+---------+------+-------+----------+
таблица ролей
+----+------+
| id | role |
+----+------+
Роль и пользователь имеют отношение One-to-One
. Например, у меня есть два типа ролей. Админ и менеджер. Администратору разрешено просматривать все продукты, но Менеджеру разрешено просматривать только те продукты, которые принадлежат ему. Сначала это кажется легкой задачей. Но у моих продуктов сложные отношения с другими таблицами или моделями. Мол, у моего магазина много отделов, которые находятся под разными менеджерами.
таблица областей
+----+------+---------+
| id | area | user_id |
+----+------+---------+
И в каждой области есть несколько отделов.
таблица отделов
+----+------+---------+
| id | area | area_id |
+----+------+---------+
И, наконец, каждый продукт принадлежит определенным отделам.
таблица товаров
+----+---------+---------------+
| id | product | department_id |
+----+---------+---------------+
Теперь я пытаюсь сказать, что моим менеджерам не разрешено показывать продукты, которые находятся под управлением других менеджеров, но администратору разрешено показывать все продукты. Я правильно сделал методы отношений в моделях. Для проверки роли пользователя я определил метод с именем checkRole
в модели User
. Это выглядит так,
public function checkRole(){
return $this->role()->pluck('role')->first();
}
А в контроллере я проверил роль и показал товары по ролям. То есть в Контроллере я пробовал,
public function getProducts(Request $request, Product $products){
$products = $products->newQuery();
if (Auth::user()->checkRole() == "manager") {
$products= $products->whereHas('department',
function($query){
$query->whereHas('area',
function($query){
$query->where('user_id', Auth::id());
});
})->orderBy('created_at' , 'desc')->get();
}
else{
$products= $products->orderBy('created_at' , 'desc')->get();
}
return $products;
}
Это работает, но есть ли лучший способ сделать это? Я имею в виду бросить Middleware
или Policy
. Я пробовал Middleware
, но проблема в том, что этот Route
действителен для каждого пользователя.