使用laravel验证检查名称在未删除项目中是否唯一

8e2ybdfx  于 2022-12-01  发布在  其他
关注(0)|答案(6)|浏览(126)

我有一个简单的表单,它发送到一个控制器,检查一个项目的名称是否已经被一个特定的项目所使用。如果是,那么它返回一个错误。这是我正在使用的代码:

'name'    => 'required|min:1|unique:versions,name,NULL,id,project_id,'.$project->id,

我遇到的问题是,我使用软删除而不是硬删除将它们从数据库中删除,这意味着,例如,“Test”只能作为名称使用一次,即使在它被删除之后。
如何检查它在未软删除的项目中是否唯一?

qcuzuvrc

qcuzuvrc1#

您可以尝试:

'name' => 'required|min:1|unique:versions,name,NULL,id,deleted_at,NULL'

这将确保versions表中的name将是唯一的,如果记录被软删除并且具有相同的名称name,则将不对其进行计数,这意味着,即使存在具有相同名称的软删除记录,name也将被接受。
若要在更新时忽略模型,您应该在name之后传递id,以取代第一个NULL

**更新:**您也可以使用类似的内容来添加您自己的自定义规则:

// You can declare it inside your controller method before you run validation
Validator::extend('unique_project', function($attribute, $value, $parameters)
{
   // $attribute will contain field name, i.e. name
   // $value will contain the value in the $attribute/name
   // $parameters will be an array of arguments passed
   // i.e. [0] => arg1, [1] => arg2, [2] => arg3 and so on

   return true for valid and false for invalid

});

您可以这样使用它:

'name' => 'required|min:1|unique_project:arg1,arg2,arg3' // add more args if needed
jtjikinw

jtjikinw2#

我知道这个问题很老了,但是我在寻找类似问题的解决方案时偶然发现了这个问题。
我有一个分类帐代码数据库,其中每个用户(user_id)的'name'和'short_name'必须是唯一的。我启用了软删除,因此它们应该只在给定用户的未删除行中是唯一的。
这是我的函数,它返回验证字符串:

protected function validation_data($user_id, $update_id = "NULL") {
        return [
        'name' => "required|max:255|unique:ledger_codes,name,$update_id,id,deleted_at,NULL,user_id,$user_id",
        'short_name' => "max:255|min:3|unique:ledger_codes,short_name,$update_id,id,deleted_at,NULL,user_id,$user_id",
        'description' => 'max:255',
        ];
    }

对于任何想知道唯一验证器的参数字符串语法的人,如下所示:

  • arg 0:数据库中的表名
  • arg 1:值唯一的字段名称
  • arg 2:要忽略的单一ID(如果不使用,则设置为大写NULL。)
  • arg 3:单个ID所在的字段。它默认为'id',因此如果不使用它,并且有更多参数,请使用字符串'id'。
  • arg 4/5:where子句的字段名/值对(在我的示例中为where('deleted_at',null)。)
  • arg 6/7:另一个字段名/值对(在我示例中为where('user_id', $user_id))。
  • arg 8/9:另一个字段名值对
  • arg 10/11:另一个.

...等等。
字段名称/值对中的值字段可以是要匹配的值、NULL或NOT_NULL。

8iwquhpp

8iwquhpp3#

如果有人正在寻找使用Rule类的解决方案。

use Illuminate\Validation\Rule;

class UpdateArticleRequest extends FormRequest
{
    /**
     * 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()
    {
        $data = $this->request->all();
        
        return [
            'slug' => [
                'required',                
                Rule::unique('articles')->ignore($data['id'])->whereNull('deleted_at')
            ]
        ];
    }
}

基本上,我们只忽略那些deleted_at字段不是null的行。
以下是可以与ignore函数一起使用的方法:https://laravel.com/api/5.8/Illuminate/Validation/Rules/DatabaseRule.html

polhcujo

polhcujo4#

用于添加记录

'name' => [
                'required',
                'string',
                'min:3',
                Rule::unique('products')->where(function ($query) {
                    return $query->where('store_id', Auth::user()->store_id);
                })->whereNull('deleted_at'),                
            ],

用于编辑记录

'name' => [
                'required',
                'string',
                'min:3',
                Rule::unique('products')->where(function ($query) {
                    return $query->where('store_id', Auth::user()->store_id);
                })->ignore($request->id, 'id')->whereNull('deleted_at'),                
            ],
a5g8bdjr

a5g8bdjr5#

创建方法时:

public function store(Request $request)
{

    $request->validate([

        'name'=>'required|unique:form_types,name,NULL,id,deleted_at,NULL',

    ]);

    // Write your code here

}

更新方法:

public function update(Request $request, $id)
{

    $request->validate([

        'name'=>'required|unique:form_types,name,'.$id.',id,deleted_at,NULL',

    ]);

    // Write Code here

}
uujelgoq

uujelgoq6#

'name' => [
'reqired',
 Rule::unique('table','column')->where('deleted_at',null)
]

相关问题