我目前有一个模型,它有一个文本字段和一个段塞字段。
我验证slug在我的表单请求类中是唯一的
public function rules()
{
return [
'name' => 'required|min:3',
'slug' => 'required|alpha_dash|unique:questions'
];
}
这在创建时效果很好,正确地否认了重复蛞蝓的创建。然而,在我的更新方法中,它不允许我保存记录,因为段塞已经存在。当然,鼻涕虫确实存在,但它存在于正在编辑的记录中,所以我想继续允许它被保存。然而,在另一个记录中,它不应该被更改为鼻涕虫。
以下是我的更新ArticlesController方法:
public function update(Article $article, ArticleRequest $request)
{
$article->update($request->all());
return redirect('articles');
}
有没有办法在L5中实现这一点?
尝试修改您的规则,如下所示(在表单请求类中):
public function rules()
{
return [
'name' => 'required,min:3',
'slug' => 'required|alpha_dash|unique:categories,slug,'.$this->id')
];
}
它对我有效。
在唯一规则中,您可以指定要忽略的id。
您可以创建两个单独的请求(一个用于创建,一个用于更新),但也可以通过这种方式检查是否设置了if(我假设您的更新url看起来像/questions/2
):
public function rules()
{
$rules = [
'name' => 'required|min:3',
'slug' => ['required', 'alpha_dash']
];
$rule = 'unique:questions';
$segments = $this->segments();
$id = intval(end($segments));
if ($id != 0) {
$rule .= ',slug,' . $id;
}
$rules['slug'][] = $rule;
return $rules;
}
}
如果你必须能够更新slug,我处理过的项目通常要求它在创建后不可编辑,那么你可以使用laravel的内置规则通过主键忽略表上的某条记录。
$rules['slug'] = "required|unique:questions,slug,{$id}";
http://laravel.com/docs/5.0/validation请参阅"强制唯一规则忽略给定ID"
在编辑文章请求中:
public function $rules ()
{
$id = $this->id;
return [
'name' => 'required|min:3',
'slug' => "required|alpha_dash|unique:articles,slug,$id",
];
}
以下是我在Laravel 5.3中的详细操作:
1-通过在终端中执行下一个命令创建一个新的表单请求类:
php artisan make:request ArticleFormRequest
其中,ArticleFormRequest
是表单请求类的名称。此命令将在app/Http/Requests
目录中创建一个名为ArticleFormRequest.php
的文件。
2-打开创建的文件并删除其内容,然后在其中放置下一个内容:
<?php
namespace App'Http'Requests;
use Illuminate'Foundation'Http'FormRequest;
use Illuminate'Http'Request;
use Illuminate'Validation'Rule;
use App'Article;
class ArticleFormRequest extends FormRequest
{
protected $rules = [
'name' => 'required|min:3',
'slug' => 'required|alpha_dash|unique:articles,slug',
];
// protected $user; // in case you want the current authenticated user
protected $request_method;
protected $id;
public function __construct(Request $request)
{
// $request->user() returns an instance of the authenticated user
// $this->user = $request->user(); // in case you want the current authenticated user
// $request->method() returns method of the request (GET, POST, PUT, DELETE, ...)
$this->request_method = strtoupper($request->method());
// segments(): Returns an array containing all of the segments for the request path
// it is important to assign the returned "segments" array to a variable first before using it, otherwise an error will occur
$segments = $request->segments();
// note this way will be valid only if "id" of the element is the last segment
$this->id = end($segments);
}
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
$rules = $this->rules;
if ($this->request_method == "POST") {
// do nothing..
} elseif (in_array($this->request_method, ["PUT", "PATCH"])) {
$article = Article::find($this->id);
if ($article) {
// forcing a unique rule to ignore a given id | https://laravel.com/docs/5.3/validation
$rules["slug"] = [
"required",
"alpha_dash",
Rule::unique("articles", "slug")->ignore($article->id, "id"),
];
// this is also can be used
// $rules['slug'] = "required|alpha_dash|unique:articles,slug,$article->id,id";
}
}
return $rules;
}
}
3-在您的控制器中,您可以在store()
和update()
方法中使用ArticleFormRequest
,如下所示:
<?php
namespace App'Http'Controllers;
use App'Http'Requests'ArticleFormRequest;
class ArticlesController extends Controller
{
public function store(ArticleFormRequest $request)
{
// your code here..
}
public function update(ArticleFormRequest $request, $id)
{
// Your code here..
}
}
如前所述,您可以在验证器功能中使用忽略功能。
只需引用您希望忽略的项目的id,并确保在更新时使用补丁请求!
点击此处查看更多信息!http://laravel.com/docs/5.0/validation#rule-唯一
protected $rules = [
'name' => 'required|min:3',
'slug' => 'required|alpha_dash|unique:questions'
];
public function rules()
{
$rules = $this->rules;
if ($this->isMethod('patch'))
{
$id = $this->articles;
$rules['slug'] = $rules['slug'].',slug,'.$id;
}
return $rules;
}