Уникальная проверка Laravel на нескольких столбцах

У меня есть 2 столбца в серверах таблиц.

У меня есть столбцы ip и hostname.

У меня есть проверка:

'data.ip' => ['required', 'unique:servers,ip,'.$this->id]

Это работает только для столбца ip. Но как это сделать, и для hostname столбца?

Я хочу проверить data.ip с столбцами ip и hostname. Потому что могут быть дубликаты в столбцах ip и hostname, когда пользователь пишет ip.

Ответы

Ответ 1

Вы можете использовать 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
);

Ответ 2

Следующее будет работать над созданием

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

и следующее для обновления

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

Я предполагаю, что id - это ваш первичный ключ в таблице. Замените это на ваше окружение.


(Недокументированный) формат для уникального правила:

таблица [, столбец [, игнорировать значение [, игнорировать столбец [, где столбец, где значение]...]]]

Можно указать несколько условий "where", но можно проверить только равенство. Закрытие (как в принятом ответе) необходимо для любых других сравнений.

Ответ 3

Laravel 5.6 и выше

Проверка в контроллере

Первичный ключ (в моем случае) представляет собой комбинацию двух столбцов (name, guard_name)

Я проверяю их уникальность с помощью класса Rule как при создании, так и при обновлении метода моего контроллера (PermissionsController)


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');
    }
}

Обратите внимание, что в методе обновления я добавил дополнительное ограничение запроса [ whereNotIn ('id', [$permission-> id]) ], чтобы игнорировать текущую модель.


Ресурсы/языки /EN/messages.php

<?php

return [

    'permission' => [

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

        'flash' => [
            'updated' => '...',
            'created' => '...',
        ],
    ]
]

Метод flash() взят из пакета laracasts/flash.

Ответ 4

Попробуйте следующее правило:
'data.ip' => 'required|unique:servers,ip,'.$this>id.'|unique:servers,hostname,'.$this->id

Ответ 5

Таблица

сервер

поле

  • id primary key

  • ip should be unique with hostname

  • hostname should be unique with ip

Здесь я проверяю на Ip и имя хоста должно быть уникальным.

use Illuminate\Validation\Rule;

$ip = '192.168.0.1';
$host = 'localhost';

Во время создания

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

Во время обновления

Добавить игнорировать после 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);
    ],
]);

Ответ 6

Это работает как для создания, так и для обновления.

[
     'column_1' => 'required|unique:TableName,column_1,' . $this->id . ',id,colum_2,' . $this->column_2
]

Примечание: проверено в Laravel 6.