我正在尝试制作简单独特的slu .. slu are在数据库中正确保存,因此功能正常。我有使它们与众不同的问题。
我在TagCreateRequest.php中有这个规则
public function rules()
{
$rules = [
'tag' => 'required|min:3',
'tag_slug' => 'required|alpha_dash|unique:tag,tag_slug,'
];
$rule = 'unique:tag';
$segments = $this->segments();
$id = intval(end($segments));
if ($id != 0) {
$rule .= ',tag_slug,' . $id;
}
$rules['tag_slug'][] = $rule;
return $rules;
}
这是我在控制器中的商店功能
public function store(TagCreateRequest $request)
{
$tag = new Tag();
foreach (array_keys($this->fields) as $field) {
$tag->$field = $request->get($field);
}
$tag->save();
return redirect()->route('tags');
}
错误是关于尝试添加重复值
SQLSTATE [23000]:完整性约束违规:1062重复条目'tags_tag_unique'的重复条目'unique slug'
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
您可以神奇地访问id字段。 ID必须与路线中使用的路线参数相同。
如果您使用像Route::put('post/{id}/update')
这样的id参数,那么您可以神奇地访问表单请求中的id参数。否则,如果您拨打{post} Route::put('post/{post}/update')
参数,则在您的表单请求中,您必须致电$this->post
而不是$this->id
,好吗?
请尝试一下:
public function rules()
{
$rules = [
'tag' => 'required|min:3'
];
$slugRule = 'required|alpha_dash|unique:tag_slug';
if (! empty($this->id)) {
$slugRule = 'required|alpha_dash|unique:tag_slug,'.$this->id;
}
$rules['tag_slug'] = $slugRule;
return $rules;
}
如果你在两种方法中注入了这个FormRequest,它将在store()和update()方法上正常工作。
看到它:
// Your store route
Route::post('/post/store', ['as' => 'post.store', 'uses' => 'YourController@store']);
// YourController store method
public function store(NameSpaced\FormRequest $request)
{
// ...
}
// Your update route
Route::post('/post/{id}/update', ['as' => 'post.update', 'uses' => 'YourController@store']);
// YourController update method
public function update(NameSpaced\FormRequest $request)
{
// ...
}
答案 1 :(得分:0)
$rules = [
'tag' => 'required|min:3',
'tag_slug' => 'required|alpha_dash|unique:[table name],[column name]'
];
尝试这个,第一个是表名,第二个是你想要唯一的列名,写时不添加方括号。或者你只是传递这样的表名,
$rules = [
'tag' => 'required|min:3',
'tag_slug' => 'required|alpha_dash|unique:[table name]'
];
laravel自动检查列。 我希望它有所帮助。
答案 2 :(得分:0)
我建议您在创建标记时自动生成新的slug。我自己也遇到了你在这里列出的相同问题,因此我决定在创建新项目时自动生成。我用了laravel-sluggable。它会自动生成独特的slu ..
根据您的问题,我在我的一个演示应用程序中定义了一个独特的slug规则:
public function rules()
{
return [
'name' => 'required|string|max:255',
'slug' => 'required|string|max:255|unique:categories,slug,'.$this->segment(3),
];
}
请注意,$this->segment(3)
是指后端页面中正在更新的模型的ID,在您的应用程序中可能会有所不同。