Laravel, показывать только список товаров владельца, выбрасывать тот же маршрут и несколько моделей - PullRequest
0 голосов
/ 08 октября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...