2016-07-08 57 views
0

如果模型具有唯一字段,我無法更新模型。我收到消息「這個名字已經被拿走了。」使用唯一字段更新Laravel模型

我的控制器:

/** 
* 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> 
+0

你可以包括你的路由定義? – rzb

+0

試試我的更新答案。 – rzb

回答

0

好了,這個工作對我來說:

在我UpdateCategoryRequest:

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

要從檢查中排除當前模型,請將該ID作爲3rd列傳遞。

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

這不會起作用,因爲在不在對象上下文中時使用$ this。但它指向了正確的方向。 – rzb

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作爲參數,並建立統治在那裏。

0

在您的請求中,只需附加到您從模型中獲得的「名稱」規則即可。

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

「SQLSTATE [42S22]:未找到列:1054'where子句'中的未知列''是用代碼保存時得到的結果。 – showFocus

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; 
    } 
} 
+0

「未定義的變量:ID」 – showFocus

+0

我認爲錯誤是從視圖而不是請求。請完全解釋你的錯誤 –

+0

如上圖所示,改變你的方法 –

0
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')); 
} 
+0

仍然收到「該名稱已被使用。「 – showFocus

+0

好的,你需要把條件放在那裏。由於你已經提出了對方法的單獨請求,它將不會識別你的ID。我已經在請求頁面上做了一些修改 –

+0

仍然得到相同的驗證錯誤」名稱已經被採納。「 – showFocus