仅在满足条件的情况下允许laravel关系

时间:2019-02-20 09:09:11

标签: laravel laravel-5

我编辑了问题,因为我的第一次尝试完全令人误解。抱歉。

我正在使用laravel构建api,并具有以下模型/表:

user
---
id
name

customers
---
id
name
user_id

projects
---
id
name
user_id
customer_id (can be NULL)

项目始终属于用户,也可以选择属于客户。客户始终属于用户。例如:

users = [
    {id: 1, name: "user1"},
    {id: 2, name: "user2"}
]

customers = [
    {id: 1, name: "c1", user_id: 1},
    {id: 2, name: "c2", user_id: 1},
    {id: 3, name: "c3", user_id: 2}
]

projects = [
    {id: 1, name: "p1", user_id: 1},
    {id: 2, name: "p2", user_id: 1, customer_id: 1},
    {id: 3, name: "p3", user_id: 2, customer_id: 2}
]

如何通过创建或更新项目来防止某人在DB中创建无效数据,该项目的客户ID确实属于另一个用户的客户,而客户ID则属于该项目的user_id。例如:

newProject = {id:4,名称:“ p4”,user_id:1,customer_id:3}

如您所见,新项目应该属于用户1和客户3,这是不可能的。

4 个答案:

答案 0 :(得分:1)

最优雅的解决方案是使用Laravel请求验证系统,因为那实际上是您的问题:对传入请求的复杂验证约束。

要这样做:

这就是Laravel的方法。

答案 1 :(得分:0)

您可以这样操作。

 class User extends Eloquent {

        public function scopePopular($query)
        {
            return $query->where('votes', '>', 100);
        }

    }

如果模型为true,则可以从模型中调用另一个方法,然后可以将其发送给控制器。

更多Query Scopes

希望对您有帮助:)

答案 2 :(得分:0)

我的建议是:不要将授权逻辑放入模型中,而应使用控制器。

在模型中,您可以定义范围,用于限制对授权模型列表的访问。

您确实必须阅读laravel official docs中的授权一章。

更新:在控制器中,您可以验证用户输入的客户是用户客户之一,甚至可以使用表单请求验证,以防返回错误。要进行验证,您可以see here

答案 3 :(得分:0)

我相信您需要注册policy。请按照链接的文档页面上的说明进行操作,然后在您的策略方法中包括以下内容:

public function update(User $user, Customer $customer)
{
    return $customer->user_id === $user->id;
}

public function create(User $user, Customer $customer)
{
    return $customer->user_id === $user->id;
}

这将使其在createupdate方法上工作。

  

这里要注意的重要部分是:

return $customer->user_id === $user->id;

这将确保对于给定的customeruser,客户上的user_idid上的user匹配,这就是你要。

要使其在Projects模型上工作,您需要在auth服务提供商中执行以下操作:

class AuthServiceProvider extends ServiceProvider
{

protected $policies = [
    Project::class => ProjectPolicy::class,
];

ProjectPolicy是执行php artisan make:policy时设置的策略名称(如链接文档中所述)。