【问题标题】:How to update on laravel request a unique field on validation如何更新 laravel 请求验证的唯一字段
【发布时间】:2019-11-11 20:25:10
【问题描述】:

我正在尝试编辑一个表单,其中我有一个带有标题、正文和 slug 的帖子,slug 是独一无二的,所以如果我编辑而不更新它,它会说它已经被占用了

我正在我的 PostRequest 验证中尝试这个:

public function rules()
    {
       return [
            'title' => 'required',
            'body' => 'required',
            'metaTitle' => 'required',
            'metaDescription' => 'required',
            'slug' => ['required', Rule::unique('posts')->ignore($this->post)],
        ];
    }

Post 控制器的功能是:

public function store(PostStoreRequest $request)
    {
        $validated = $request->validated();
        auth()->user()->posts()->create($validated);
        return redirect()->route('articulos.index');
    }

在我的刀片更新表单上我也有 @method('PUT')

【问题讨论】:

    标签: php laravel laravel-5.8


    【解决方案1】:

    你应该试试这个:

    
    public function rules()
     {     
           $slug = $this->request->get("slug");
    
           return [
                'title' => 'required',
                'body' => 'required',
                'metaTitle' => 'required',
                'metaDescription' => 'required',
                'slug' => ['required', Rule::unique('posts')->ignore($slug,'slug')],
            ];
      }
    
    

    【讨论】:

    • 有效,但如果您在创建时尝试添加不唯一的 slug,则会引发错误 SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'dasddas' for key 'posts_slug_unique' 但更新方法有效正确
    • 你是对的——这只适用于更新。我认为创建和更新的请求应该分开。在创建的情况下 - 摆脱 '->ignore($slug,'slug')' 部分
    • 我做了两个验证请求,postStore 和 postUpdate,一切正常,谢谢!
    【解决方案2】:

    请同时尝试StoreUpdate 方法:

    'slug' => [ 
        'required', 
        'slug', 
        'unique:posts,slug' . (isset($this->post)  ? ',' . $this->post : ' ') 
    ],
    

    【讨论】:

    • 不能把它放在我的 PostRequest 验证中,因为 $this->post 是 NULL,我怎样才能得到它?
    • 在存储方法中你不需要并更新你传递一个 id 然后在验证方法中获取对象传递然后 'unique:posts,slug' 。 (isset($object->slug) ? ',' . $object-slug : ' ')
    【解决方案3】:

    这是我找到的唯一解决方案,使用我自己的验证器 PostRequest 不起作用,因此我在更新函数中验证更新:

    public function update(Request $request, $id) {
            $request->validate([
                'slug' => 'required|unique:posts,slug,' . $id,
                'title' => 'required',
            ]);
    
             $post = Post::find($id);
             $post->fill($request->all());
             $post->save();
            return redirect()->route('articulos.index');
        }
    

    知道为什么会发生这种情况以及如何解决它会很酷,但这目前正在工作

    【讨论】:

      【解决方案4】:

      试试这个希望它会工作

      public function rules(Request $request)
          {
              return [
                  'title' => 'required',
                  'body' => 'required',
                  'metaTitle' => 'required',
                  'metaDescription' => 'required',
                  'slug' => 'required|slug|unique:posts,slug,' . $this->post,
              ];
          }
      

      【讨论】:

      • 现在它显示“未定义变量:帖子(视图:C:\wamp64\www\item.github\resources\views\manager\posts\list.blade.php)”
      • 'slug' => ['required', 'slug', Rule::unique('posts')->ignore($this->post, 'id') ],
      • this->post 是你的帖子对象 id 吗?
      • 不,它是整个帖子,尝试了你现在所说的我得到了不同的错误“方法 Illuminate\Validation\Validator::validateSlug 不存在。”
      • 好像 $this-post 是空的
      猜你喜欢
      • 2018-07-05
      • 2023-03-27
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 2018-12-25
      • 2019-03-24
      • 1970-01-01
      • 2020-11-12
      相关资源
      最近更新 更多