Я пытаюсь отобразить списки товаров нескольких владельцев, использующих один и тот же маршрут.Например, мой маршрут:
http://example.com/store/public/products
Примечание: я не хочу помещать 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
действителен для каждого пользователя.