Уникальная проверка 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
Таблица
сервер
поле
Здесь я проверяю на 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.