使用唯一字段更新Laravel模型

时间:2016-07-08 02:14:58

标签: php validation laravel laravel-5 laravel-5.2

如果模型具有唯一字段,则无法更新模型。我收到消息“这个名字已经被拿走了。”

我的控制器:

/**
 * Update the specified Category in storage.
 *
 * @param  int              $id
 * @param UpdateCategoryRequest $request
 *
 * @return Response
 */
public function update($id, UpdateCategoryRequest $request)
{
    $category = $this->categoryRepository->findWithoutFail($id);

    if (empty($category)) {
        Flash::error('Category not found');

        return redirect(route('categories.index'));
    }

    $category = $this->categoryRepository->update($request->all(), $id);

    Flash::success('Category updated successfully.');

    return redirect(route('categories.index'));
}

UpdateCategoryRequest

 /**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return Category::$rules;
}

类别模型

    /**
 * Validation rules
 *
 * @var array
 */
public static $rules = [
    'name' => 'required|unique:categories,name'
];

我已尝试附加我的规则,如下:

$this->id
$id

@include('adminlte-templates::common.errors')
       <div class="box box-primary">
           <div class="box-body">
               <div class="row">
                   {!! Form::model($category, ['route' => ['categories.update', $category->id], 'method' => 'patch']) !!}

                        @include('categories.fields')

                   {!! Form::close() !!}
               </div>
           </div>
       </div>

6 个答案:

答案 0 :(得分:3)

要从支票中排除当前模型,请将ID作为3rd列传递。

'name' => 'required|unique:categories,name,'. $this->id

答案 1 :(得分:1)

好的,这对我有用:

在我的UpdateCategoryRequest中:

public function rules()
    {
        $rules = Category::$rules;
        if ($this->isMethod('patch'))
        {
            $id = $this->categories;
            $rules['name'] = $rules['name'].',name,'.$id;
        }
        return $rules;
    }

答案 2 :(得分:0)

我认为您无法通过静态检索模型中的规则而无需任何更改来解决此问题,因为您必须动态地将模型ID附加到unique规则作为第三个参数。

要获取模型ID,您需要访问FormRequest课程中仅在您的案例中使用$this->route('id')的请求。或者,如果您使用的是route model binding,并且您已将路线路径定义为my/route/{category},那么:

public function rules()
{
    $category = $this->route('category');

    $rules = Category::$rules;
    $rules['name'] .= ",{$category->id}";

    return $rules;
}

除非你当然想要在你的模型中声明一个getter方法,它将接受id作为参数并在那里构建规则。

答案 3 :(得分:0)

在您的请求中,只需附加您从模型中获得的“名称”规则。

public function rules()
{
    $rules = Category::$rules;
    $rules['name'] .= ','. $this->route('id');
    return $rules;
}

答案 4 :(得分:0)

这样做。

您需要排除当前模型。由于您要求表格唯一,因此不会排除当前列或说出ID。

编辑您的请求

public function rules()
{
    switch($this->method())
    {
        case 'GET':
        case 'DELETE':
        {
            return [];
        }
        case 'POST':
        {
            return [
                'name' => 'required|unique:categories',

            ];
        }
        case 'PUT':
        case 'PATCH':
        {
            return [
                'name' => 'required|unique:categories,name,'.$this->getSegmentFromEnd().',id'

        }
        default:break;
    }
}

答案 5 :(得分:-1)

public function update($id, UpdateCategoryRequest $request)
{
    $category = $this->categoryRepository->findWithoutFail($id);

    if (empty($category)) {
        Flash::error('Category not found');

        return redirect(route('categories.index'));
    }

    $category = $category->update($request->all());

    Flash::success('Category updated successfully.');

    return redirect(route('categories.index'));
}