【问题标题】:Unique slug in editing with form request update method Laravel 5.4使用表单请求更新方法 Laravel 5.4 编辑的独特 slug
【发布时间】:2018-03-20 00:02:37
【问题描述】:

嘿,我很难使用这种更新方法我的新闻模型中有一个 slug 字段,它必须是唯一的,现在当我更新时,有时我可能不想更改 slug 但 laravel 的验证不会让我发送我的数据,当我绕过验证时,Mysql 不会因为重复而让我插入到 slug 字段中。这是我的更新方法和验证我有一个handleRequest,它只是为了验证正在上传的图像。

新闻控制器

public function update(CreateNewsRequest $request, $id)
{
        $news = News::findOrFail($id);    
        $data = $this->handleRequest($request);              
        $news->update($data);

    return redirect(route('admin.access.news.index'))->with('message', 'Your news has been updated');
}

创建新闻请求

 public function authorize()
{
    //if(access()->hasRole(1) || access()->hasRole(2))
    return true;
}


 public function rules(){     

$news = $this->route()->parameter('news');

$rules = [
    'title' => 'required',
    'slug' => 'required|unique:news',
    'excerpt' => 'required',
    'body' => 'required',
    'category_id' => 'required',
    'image' => 'mimes:gif,bmp,jpeg,jpg,png',
];

    switch($this->method()){
    case 'PUT':
    case 'PATCH':
        $rules['slug'] = 'required|unique:news,slug,' .$news;
        break;
    }

return $rules;
}

}

我现在把这个函数放在 NewsController 里

private function handleRequest($request)
{
    if(! $request->published_at ){
            $request->published_at = null;
        }

    $data = $request->all();

    if($request->hasFile('image'))
    {

        $image = $request->file('image');          
        $fileName = $image->getClientOriginalName();            
        $destination = public_path(config('cms.image.directory'));                      
        $successUploaded = $image->move($destination, $fileName);

        if($successUploaded)
        {
            $width = config('cms.image.thumbnail.width');
            $height = config('cms.image.thumbnail.height');
            $extension = $image->getClientOriginalExtension();
            $thumbnail = str_replace(".{$extension}", "_thumb.{$extension}", $fileName);
            Image::make($destination . '/' . $fileName)
                        ->resize($width, $height)
                        ->save($destination . '/' . $thumbnail);
        }
        $data['image'] = $fileName;
    }
    return $data;
}

【问题讨论】:

    标签: php laravel-5 eloquent


    【解决方案1】:

    @AndriyLozynskiy 编辑工作!原来我的表格有误,感谢您的帮助。

    我还稍微更改了验证并创建了一个 UpdateFormRequest.php

     public function rules(Request $request){
    
        $news = $this->route('news');
    
            $rules = [
                'title' => 'required',
                'excerpt' => 'required',
                'body' => 'required',
                'category_id' => 'required',
                'image' => 'mimes:gif,bmp,jpeg,jpg,png',
                'slug' => ($request->slug != $this->slug) ? 'required|alpha_dash|min:5|max:255|unique:news,slug' : ''
            ];
    
            return $rules;
       }
    }
    

    【讨论】:

      【解决方案2】:

      您应该通过id 忽略您当前的模型,而不是通过可以在更新表单中更改的其他字段。试试这个:

      switch($this->method()){
          case 'PUT':
          case 'PATCH':
              $id = $this->route('id');
              $rules['slug'] = 'required|unique:news,slug,'.$id;
              break;
          }
      

      【讨论】:

      • 感谢您的洞察力,我刚刚尝试了这种方法,但它仍然不允许我插入数据库我什至没有达到 mysql 因为重复条目而将我抛出的地步,我刚刚删除了那个键,现在试图专注于能够正确更新;
      • @DavidDacruz 尝试dd($id) 我不确定这是否是获取当前模型 ID 的正确方法。
      • 我会继续努力再次感谢!
      • dd($id) 在我执行 route('news') 时给我 null 我得到 1 所以我再次尝试但我仍然得到 slug duplicate stop 错误:)
      • make php artisan route:list 并查看更新 url 中的参数名称。例如,如果它看起来像 news/{news_id},您可以在自定义表单请求中按名称获取此参数,例如 $this->route('news_id')
      猜你喜欢
      • 1970-01-01
      • 2017-09-14
      • 2018-07-26
      • 2016-12-19
      • 2021-05-10
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 2015-05-30
      相关资源
      最近更新 更多