2021-07-20 14:28:01  3173 0

Laravel在reques验证类中获取模型对象

 标签:   

大家好今天猪哥给大家讲下在Laravel框架中如何 在Request验证类中获取模型对象

如图所示:

image.png

假如我们现在有个需求就是编辑的文章标题不能重复,我们应该怎么做呢?有1 个地方需要思考下,就是如何不在html表单 传递 文章id的情况下

获取 文章的id!因为我们在做表单验证的时候,需要对标题做唯一性检查,还有个问题需要思考下,就是验证标题唯一性的时候要排除当前要编辑的文章。下面看看猪哥

是怎么做的吧

我们先创建一个验证类

php artisan make:request TopicRequest

生成文件后我们 开始 编写代码:代码如下

<?php

namespace App\Http\Requests;

use Illuminate\Support\Facades\Auth;

class TopicRequest extends Request
{
    public function rules()
    {
        switch($this->method())
        {
            // CREATE
            case 'POST':
                return  [
                    'title' => 'required|min:2|unique:topics,title',
                    'body' => 'required|min:10',
                    'category_id' => 'required|numeric',
                ];
                break;
            // UPDATE
            case 'PUT':
            case 'PATCH':
            {
                return [
                     'title' => 'required|min:2|unique:topics,title,'. $this->route('topic')->id,
                     'body' => 'required|min:10',
                     'category_id' => 'required|numeric',
                ];
            }
        }
    }

    public function messages()
    {
        return [
            'title.min' => '标题必须至少两个字符',
            'title.unique' => '文章标题重复',
            'body.min' => '文章内容必须至少三个字符',
            'category_id.required' => '请选择帖子分类'
        ];
    }
}

请注意下图 的代码片段 

image.png

在 Laravel 中如果验证 唯一性 可以使用 unique:表名称,字段名称 就可以了,这种方法只局限在创建

如果更新的话 那就不行了,就必须 按照上面方框中所示的代码才可以。

首先我们使用了 $this->route('topic') 这段代码的意思是 我们传递当前编辑文章的路由参数topic 就可以获取到当前文章的模型对象

我们在使用 $this->route('topic')->id 就可以获取到当前编辑的文章的 id了,有了 id 就实现了我们的在编辑文章验证唯一的需求了,

在Laravel 中 我们在更新的时候 验证唯一性 只需要 

unique:topics,title,'. $this->route('topic')->id,

后面加入当前模型的 id 表示排除自身的 id 即可。

感谢大家阅读,下次教程见