Laravel对多列的唯一验证

Dum*_*tru 19 php laravel

我在表服务器中有2列.

我有专栏iphostname.

我有验证:

'data.ip' => ['required', 'unique:servers,ip,'.$this->id]
Run Code Online (Sandbox Code Playgroud)

这仅适用于列ip.但是如何做到这一点hostname呢?

我想要使​​用列iphostname.验证data.ip.因为在ip和hostname列中可以重复,当用户写ip时.

Nik*_*aut 25

您可以使用它Rule::unique来实现验证规则

$messages = [
    'data.ip.unique' = 'Given ip and hostname are not unique',
];

Validator::make($data, [
    'data.ip' => [
        'required',
        Rule::unique('servers')->where(function ($query) use($ip,$hostname) {
            return $query->where('ip', $ip)
            ->where('hostname', $hostname);
        }),
    ],
],
$messages
);
Run Code Online (Sandbox Code Playgroud)

  • 如需更新,请使用 inore。`->ignore($serverid);` 查看答案 /sf/answers/4061995381/ (3认同)
  • @RazibAlMamun 对于更新使用这个 `$text = $this->request->text; $branch_id = $this->请求->branch_id; $tax_id = $this->请求->tax_id; $validator = \Validator::make($this->request->all(), array( 'text' => [ 'required', Rule::unique('cpl_tax')->where(function ($query) use($tax_id, $text, $branch_id) { return $query->where('text', $text) ->where('branch_id', $branch_id)->where('tax_id', '!=', $tax_id); }), ], ));` (2认同)

Leo*_*mer 13

以下将在创建上工作

'data.ip' => ['required', 'unique:servers,ip,'.$this->id.',NULL,id,hostname,'.$request->input('hostname')]
Run Code Online (Sandbox Code Playgroud)

和以下更新

'data.ip' => ['required', 'unique:servers,ip,'.$this->id.','.$request->input('id').',id,hostname,'.$request->input('hostname')]
Run Code Online (Sandbox Code Playgroud)

我假设这id是您在表中的主键。将其替换为您的环境。


唯一规则的(未记录)格式为:

[, [,忽略值 [,忽略列 [,其中列 ] ...]]]

可以指定多个“ where”条件,但只能检查是否相等。其他任何比较都需要使用闭包(如接受的答案中所示)。

  • 我怀疑 `$request->input('id')` 是必要的。这对我有用 `['column_1' => 'required|unique:TableName,column_1,' 。$this->id 。',id,colum_2,' 。$this->column_2]` 用于创建和更新。 (2认同)

Dil*_*ara 12

桌子

服务器

场地

  • ID primary key

  • ip should be unique with hostname

  • 主机名 should be unique with ip

在这里,我验证了 Ip 并且主机名应该是唯一的。

use Illuminate\Validation\Rule;

$ip = '192.168.0.1';
$host = 'localhost';
Run Code Online (Sandbox Code Playgroud)

创建时

Validator::make($data, [
    'ip' => [
        'required',
         Rule::unique('server')->where(function ($query) use($ip,$host) {
           return $query->where('ip', $ip)->where('hostname', $host);
         });
    ],
]);
Run Code Online (Sandbox Code Playgroud)

虽然更新

在后面添加忽略 RULE

Validator::make($data, [
    'ip' => [
        'required',
         Rule::unique('server')->where(function ($query) use($ip,$host) {
           return $query->where('ip', $ip)->where('hostname', $host);
         })->ignore($serverid);
    ],
]);
Run Code Online (Sandbox Code Playgroud)


Hal*_*cht 10

对于表单请求:

在 StoreServerRequest 中(用于创建)

public function rules() {
    'ip' => [
        'required',
         Rule::unique('server')->where(function ($query) {
             $query->where('ip', $this->ip)
                ->where('hostname', $this->host);
         })
    ],
}

public function messages() {
    return [
       'ip.unique' => 'Combination of IP & Hostname is not unique',
    ];
}
Run Code Online (Sandbox Code Playgroud)

在 UpdateServerRequest 中(用于更新)

只需在最后添加忽略即可

public function rules() {
    'ip' => [
        'required',
         Rule::unique('server')->where(function ($query) {
             $query->where('ip', $this->ip)
                ->where('hostname', $this->host);
         })->ignore($this->server->id)
    ],
}
Run Code Online (Sandbox Code Playgroud)


O C*_*nor 9

这对我来说既适用于创建又适用于更新。

[
     'column_1' => 'required|unique:TableName,column_1,' . $this->id . ',id,colum_2,' . $this->column_2
]
Run Code Online (Sandbox Code Playgroud)

注意:在 Laravel 6 中测试。


che*_*aby 8

Laravel 5.6及更高版本

控制器中的验证

主键(在我的情况下)是两列(nameguard_name)的组合

我通过在控制器的创建方法和更新方法(PermissionsController)上使用Rule类来验证其唯一性


PermissionsController.php

<?php

namespace App\Http\Controllers;

use App\Permission;

use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use App\Http\Controllers\Controller;

class PermissionsController extends Controller
{

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        request()->validate([

            'name'        => 'required|max:255',

            'guard_name'  => [

                'required', 

                Rule::unique('permissions')->where(function ($query) use ($request) {

                    return $query
                        ->whereName($request->name)
                        ->whereGuardName($request->guard_name);
                }),
            ],
        ],
        [
            'guard_name.unique' => __('messages.permission.error.unique', [

                'name'              => $request->name, 
                'guard_name'        => $request->guard_name
            ]),
        ]);

        Permission::create($request->all());

        flash(__('messages.permission.flash.created'))->success();

        return redirect()->route('permission.index');
    }


    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, Permission $permission)
    {
        request()->validate([

            'name'        => 'required|max:255',

            'guard_name'  => [

                'required', 

                Rule::unique('permissions')->where(function ($query) use ($request, $permission) {

                    return $query
                        ->whereName($request->name)
                        ->whereGuardName($request->guard_name)
                        ->whereNotIn('id', [$permission->id]);
                }),
            ],
        ],
        [
            'guard_name.unique' => __('messages.permission.error.unique', [

                'name'              => $request->name, 
                'guard_name'        => $request->guard_name
            ]),
        ]);

        $permission->update($request->all());

        flash(__('messages.permission.flash.updated'))->success();

        return redirect()->route('permission.index');
    }
}
Run Code Online (Sandbox Code Playgroud)

注意,在更新方法中,我添加了一个附加的查询约束[ whereNotIn('id',[$ permission-> id]) ]以忽略当前模型。


资源/ lang / en / messages.php

<?php

return [

    'permission' => [

        'error' => [
            'unique' => 'The combination [":name", ":guard_name"] already exists',
        ],

        'flash' => [
            'updated' => '...',
            'created' => '...',
        ],
    ]
]
Run Code Online (Sandbox Code Playgroud)

flash()方法来自laracasts / flash程序包。

  • 绝对完美的解决方案 (3认同)
  • 这绝对应该是公认的答案。在语言文件中包含自定义错误消息使其非常灵活并提供完美的反馈。谢谢 (2认同)

vpa*_*ade 6

试试这个规则:
'data.ip' => 'required|unique:servers,ip,'.$this>id.'|unique:servers,hostname,'.$this->id