Laravel Request中的rules()函数不会创建唯一的slug

时间:2017-10-17 12:37:14

标签: php laravel laravel-5

我正在尝试制作简单独特的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'

有人可以帮我解决这个问题吗?

3 个答案:

答案 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,在您的应用程序中可能会有所不同。