我编辑了问题,因为我的第一次尝试完全令人误解。抱歉。
我正在使用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,这是不可能的。
答案 0 :(得分:1)
最优雅的解决方案是使用Laravel请求验证系统,因为那实际上是您的问题:对传入请求的复杂验证约束。
要这样做:
这就是Laravel的方法。
答案 1 :(得分:0)
您可以这样操作。
class User extends Eloquent {
public function scopePopular($query)
{
return $query->where('votes', '>', 100);
}
}
如果模型为true,则可以从模型中调用另一个方法,然后可以将其发送给控制器。
希望对您有帮助:)
答案 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;
}
这将使其在create
和update
方法上工作。
这里要注意的重要部分是:
return $customer->user_id === $user->id;
这将确保对于给定的customer
和user
,客户上的user_id
与id
上的user
匹配,这就是你要。
要使其在Projects模型上工作,您需要在auth服务提供商中执行以下操作:
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
Project::class => ProjectPolicy::class,
];
ProjectPolicy
是执行php artisan make:policy
时设置的策略名称(如链接文档中所述)。