【问题标题】:rules() function in Laravel Request doesn't create unique slugsLaravel 请求中的 rules() 函数不会创建唯一的 slug
【发布时间】:2017-10-17 12:37:14
【问题描述】:

我正在尝试制作简单独特的蛞蝓。蛞蝓已正确保存在数据库中,因此该功能正常工作。我在使它们独一无二时遇到了问题。

我在 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'

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

【问题讨论】:

  • tag_slug 列还是tag 表中的slug 列?
  • 我是tag_slug
  • 我说的是unique:tag,slug,只是问它不是错字吗?
  • 那么应该是unique:tag(table name) ,tag_slug (field name)
  • 是的,@user2486,这是错字。谢谢,但还是同样的错误。

标签: php laravel laravel-5


【解决方案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)
{
    // ...     
}

【讨论】:

  • 但这是我的商店功能,例如。创建标签,而不是更新
  • @peter : 如果你得到id 这个答案对你有用
  • @Peter 此函数将验证 ID 属性是否存在。当 id 存在时,该函数将用于验证更新条目而不是创建。
  • @peter 如果您的路线没有 ID,则表示您正在尝试创建新记录。当您的路线有 ID 时,表示您正在更新一条记录。
  • @MauricioRodrigues,这就是我要说的——我在创造,而不是更新。因此我没有ID
【解决方案2】:
$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 自动检查列。 希望对你有帮助。

【讨论】:

  • 修改后能分享一下ss吗
  • 如何在 Laravel 中的重复句柄上添加 slug-1slug-2 等。这是 Laravel 默认处理的吗?
  • laravel 提供了独特的规则,只能处理这个,[表名] 放你的表名而不加括号
  • 查看本手册您会更好地了解发生了什么问题,link
  • 如果您对我的回答感到满意并且对您有所帮助,请不要忘记将我的回答标记为正确答案。谢谢。
【解决方案3】:

我建议您在创建标签时自动生成新的 slug。我遇到了您在此处列出的相同问题,因此我决定在创建新项目时自动生成。我用laravel-sluggable。它会自动生成独特的 slug。

根据您的问题,我在我的一个演示应用程序中定义了一个独特的 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,它可以在您的应用程序中有所不同。

【讨论】:

    猜你喜欢
    • 2023-02-25
    • 1970-01-01
    • 2020-09-27
    • 2018-05-11
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2016-05-28
    • 2023-01-26
    相关资源
    最近更新 更多