Laravel, показывать только список продуктов владельца с одним и тем же маршрутом и несколькими моделями

Я пытаюсь отобразить списки продуктов нескольких владельцев по одному и тому же маршруту. Например, мой маршрут:

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 действителен для каждого пользователя.


person Foysal Nibir    schedule 08.10.2018    source источник
comment
немного поиска даст вам правильный ответ. stackoverflow.com/questions/39118423/ (также обратите внимание на комментарий к ответу)   -  person Zahan Safallwa    schedule 08.10.2018