Уникальная проверка Laravel на нескольких столбцах - PullRequest
0 голосов
/ 15 мая 2018

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

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

У меня есть подтверждение:

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

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

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

Ответы [ 4 ]

0 голосов
/ 15 августа 2018

Laravel 5.6 и выше

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

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

Я проверяю их уникальность, используя класс Rule как для create , так и для update метода моего контроллера ( 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', [$missions-> id]) ], чтобы игнорировать текущую модель.


resources / lang / en / messages.php

<?php

return [

    'permission' => [

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

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

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

0 голосов
/ 15 мая 2018

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

'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 является вашим первичным ключом в таблице.Замените его для своей среды.


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

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

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

0 голосов
/ 15 мая 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...