【问题标题】:Laravel 5.1 - Update name for current entry, must be unique to current User IDLaravel 5.1 - 当前条目的更新名称,对于当前用户 ID 必须是唯一的
【发布时间】:2016-05-04 01:52:11
【问题描述】:

我的GeckoRequest 文件中有以下代码。它在大多数情况下都有效,但是如果我尝试更新一个条目并保持当前名称,它会失败说该名称需要是唯一的......这是因为除了 当前在编辑表单中加载的条目。

对我来说最好的方法是检查名称对于当前用户来说是唯一的,同时还允许我在不更改名称的情况下更新相同的条目?

public function rules()
{
    switch($this->method())
    {
        case 'GET':
        case 'DELETE':
        {
            return [];
        }
        case 'POST':
        {
            return [
                'morph' => 'required',
                'sex' => 'required',
                'genetics' => 'required',
                'name' => "required|unique:geckos,name,NULL,id,user_id," . \Auth::user()->id
            ];
        }
        case 'PUT':
        case 'PATCH':
        {
            return [
                'morph' => 'required',
                'sex' => 'required',
                'genetics' => 'required',
                'name' => "required|unique:geckos,name,NULL,id,user_id," . \Auth::user()->id
            ];
        }
        default:break;
    }
}

【问题讨论】:

  • 具有唯一验证的 Null 和 id 的目的是什么?我通过像这样使用它来执行此操作 ` 'username'=> 'required|unique:users,username,'.$user->id `
  • 自从我从事这个项目以来已经很长时间了,我不记得它的用途,但是如果我将其删除,它似乎会破坏验证。我们不是检查用户名是否唯一,而是检查壁虎名称在当前用户保存的壁虎中是否唯一。目前,即使我保存 same 壁虎而不更改名称,它也会引发错误,说明名称不是唯一的
  • 根据我的研发,它给出错误“名称不是唯一的”的唯一方法可能是因为登录的用户 ID 没有到来,所以尝试转储登录用户 ID 和检查身份证是否到来。

标签: php validation laravel authentication laravel-5.1


【解决方案1】:

您应该可以在规则中指定 Gecko 资源的 ID。

    case 'PATCH':
    {
        //This is assuming that you're using route model binding
        //and that it's called gecko and not geckos (or something else).

        $id = $this->route('gecko')->id; 

        return [
            'morph' => 'required',
            'sex' => 'required',
            'genetics' => 'required',
            'name' => "required|unique:geckos,name,{$id},id,user_id," . \Auth::user()->id
        ];
    }

这将告诉 laravel 它必须是唯一的,除非 id 匹配。

NB 当在表单验证类中使用路由方法时,它会寻找在 url 中传递的附加参数(这些是由 @ 包裹的 url 部分987654322@ 在您的路线文件中)。根据这些设置的方式和/或您使用的Laravel 的版本,Laravel 可能会将参数解析为模型。

如果您不确定 laravel 是如何在路由中存储参数的,请在 rules() 方法中添加 dd($this->route());,提交表单,然后查看响应。该值将在parameters 数组中。

如果它没有被存储为模型并且它实际上只是 id:$id = $this->route('gecko')

希望这会有所帮助!

【讨论】:

  • 谢谢罗斯。我会在午休时间试试这个:)
  • 如果我使用的是壁虎资源路线,我想我只需要将壁虎改为壁虎?宁愿现在问,也不愿以后浪费时间哈哈
  • @AndyHolmes 我已经更新了我的答案以提供更多信息。另外,是的,只需将gecko 更改为geckos(或您在路由文件中调用的任何参数)。
  • 谢谢罗斯,更新也不错。一个小时后吃午饭,如果一切顺利,我会接受的
  • 不应该。本质上,唯一规则遵循此约定:unique:[table-name],[table-field],[whereNot-value],[whereNot-field],[where-field],[where-value]。如果您不指定(或 NULL)[whereNot-field],它将假定表的 primaryKey。
猜你喜欢
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多