Laravel,仅显示拥有者的产品列表中包含相同的路径和多个模型

时间:2018-10-08 05:10:13

标签: php laravel laravel-5.7

我正在尝试显示多个所有者的产品列表使用相同的路径。 例如,我的路线是:

http://example.com/store/public/products

N.B:我不想在路线中放入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;
}

它可以完成工作,但是还有更好的方法吗?我的意思是抛出MiddlewarePolicy。我尝试过Middleware,但是问题是,此Route对每个用户都有效。

0 个答案:

没有答案