【发布时间】:2016-06-12 15:59:04
【问题描述】:
我正在寻找在 Laravel 表单请求中强制执行唯一字段的最佳方法,编辑时除外。最明显的例子是只允许使用一次电子邮件地址,即系统中的每个用户都需要一个唯一的电子邮件地址。
通过使字段唯一,可以直接使用表单请求来实现:
public function rules()
{
return [
'email' => ['required', 'email', 'unique:users,email'],
];
}
这使得该字段成为必填字段,作为电子邮件进行验证,并使其在用户表中唯一。非常适合创建新用户。但是编辑呢?用户想要编辑他们的个人资料并再次保存相同的电子邮件地址是完全合理的(这是完全有效的)。但是,unique 规则当然会触发,因为电子邮件已经“使用中”(尽管用户试图自己编辑)。
Laravel 提供了一种解决方法,通过传入 user 表的 ID 来忽略:
'email' => ['required', 'email', 'unique:users,email,'.$userId]
但是如何获取用户ID?也许这是一个不好的例子,因为获取登录的用户 ID 很简单,但是其他没有存储在会话中的对象呢?
如果使用的是 REST,那么对象的 ID 将在 URL 中,并且可以通过路由获得:
$userId = $this->route('order');
但这似乎很脏。还有其他不使用 REST 修改对象的实例呢?在 Laravel 5 中编辑对象时,你们如何强制表单请求的唯一性?
【问题讨论】: