Php 如何在记录更新中验证唯一字段

Php 如何在记录更新中验证唯一字段,php,laravel,laravel-blade,laravel-8,Php,Laravel,Laravel Blade,Laravel 8,我最近启动了一个laravel项目来控制一些活动,但我目前在验证方面遇到了问题,特别是在更新包含唯一值的表上的特定记录时 在上个月Laravel8发布的几天内,有几个注释A开始了这个项目,所以也许有一些变化正在影响我 这些是我的迁移 第一个是用户及其数据, 由于输入名称与列名不匹配,因此在创建规则时必须传递列名。根据,如果数据库使用的列与传递的列不同,则还需要传递列名: Rule::unique('usuarios', 'alias')->ignore($usuario) 您也可以这样

我最近启动了一个laravel项目来控制一些活动,但我目前在验证方面遇到了问题,特别是在更新包含唯一值的表上的特定记录时

在上个月Laravel8发布的几天内,有几个注释A开始了这个项目,所以也许有一些变化正在影响我

这些是我的迁移

第一个是用户及其数据,


由于输入名称与列名不匹配,因此在创建规则时必须传递列名。根据,如果数据库使用的列与传递的列不同,则还需要传递列名:

Rule::unique('usuarios', 'alias')->ignore($usuario)

您也可以这样做:

我不清楚您的数据库结构,但我可以给您以下示例:

用户
是一个表名

name是要验证的列

'name' => 'unique:users,name,' . request('id')


在更新功能中,您可以使用

'telefono_usuario' => 'unique:usuarios,telefono_usuario,' . $usuario->id_usuario,
telefono_usuario作为您的域名

独特:usuarios是您的模型


$usuario->id\u usuario是您要更新的id

刚刚添加了一个您想要询问的密钥。我只是觉得很难理解谢谢:)这就是解决问题的方法现在我可以毫无问题地更新,只是一个简单的问题,你认为我应该保持表单中字段的名称与模型中的名称相同吗?只是为了保持一致性。我发现在大多数情况下,如果字段名相同,这会有所帮助。跟踪内容以及在数据库和post字段之间映射字段更容易。这导致了一个错误,内部查询引擎无法找到字段SQLSTATE[42S22]:未找到列:1054 where子句中的未知列“id”(SQL:select count(*)从
usuarios
where
telefono_usuario
=+00112345678和
id
5)的聚合看来您没有在模型中定义主键。请尝试受保护的$primaryKey='id_usuario';如果表主键为“id\u usuario”
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\usuarios;
use DB; 
use Illuminate\Support\Facades\Storage; //para almacenar
use Illuminate\Http\File;
use Illuminate\Validation\Rule;

class UsuariosController extends Controller
{

    /**
     * Muestra el formulario para agregar usuarios
     * Este debe estar disponible solo para el administrador
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        $tipos_usuarios = DB::table('tipos_usuarios')->where('nombre_tipo_usuario', '!=' ,'Administrador')->get();
        $cargos_usuarios = DB::table('cargos_usuarios')->get();
        return view('layouts/sistema/usuarios/agregar_usuario', ['tipos_usuarios' => $tipos_usuarios, 'cargos_usuarios' => $cargos_usuarios] );
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $solicitud
     * @return \Illuminate\Http\Response
     */
    public function store(Request $solicitud)
    {

        $solicitud->validate([
            'archivo_foto_usuario' =>['required', 'mimes:jpeg,png, webp,jpg', 'dimensions:min_width=50,min_height=50,max_width=200,min_height=200'],

            'nombre_usuario' => ['required', 'min:3', 'max:255'],
            'apellido_usuario' =>  ['required', 'min:3', 'max:255'],

            'telefono_usuario' => ['required', 'regex:/^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$/','unique:usuarios,telefono_usuario' ],
    

            'alias_usuario' =>  ['required', 'min:3', 'max:255','unique:usuarios,alias'],

            'contraseña_usuario' =>  ['required','min:8','regex:/^.*(?=.{3,})(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[\d\x])(?=.*[!$#%]).*$/'],

            'correo_usuario' => ['required', 'regex:/[a-z0-9._%+-]@manilastudio.com$/', 'unique:usuarios,correo'], 

            'tipo_usuario' => 'required',
            'cargo_usuario' => 'required',
        ],  [
            'archivo_foto_usuario.required' => 'Se necesita una imagen en formato compatible',
            'archivo_foto_usuario.mimes' => 'Formato de imagen no soportado',
            'archivo_foto_usuario.dimensions' => 'La imagen debe ser de mimino 50x50 y maximo 200x200',

            'nombre_usuario.required' => 'Campo requerido, introduzca al menos 4 caracteres.',
            'nombre_usuario.min' => 'Campo requerido, introduzca al menos 4 caracteres.',

            'apellido_usuario.required' => 'Campo requerido, introduzca al menos 4 caracteres.',
            'apellido_usuario.min' => 'Campo requerido, introduzca al menos 4 caracteres.',

            'telefono_usuario.required' => 'Introduza un numero teléfonico valido',
            'telefono_usuario.regex' => 'El formato debe ser +50512345678',
            'telefono_usuario.unique' => 'Este número ya esta en uso',

            'alias_usuario.required' => 'Campo requerido, introduzca al menos 4 caracteres.',
            'alias_usuario.min' => 'Campo requerido, introduzca al menos 4 caracteres.',
            'alias_usuario.unique' => 'Esta alias ya esta en uso',

            'contraseña_usuario.required' => 'Campo requerido, introduzca al menos 8 letras, con números o caracteres',
            'contraseña_usuario.min' => 'Campo requerido, introduzca al menos 8 letras, con números o caracteres.',
            'contraseña_usuario.regex' => 'La contraseña temporal debe tener letras o números y caracteres',

            'correo_usuario.regex' => 'El correo debe usar el dominio manilastudio.com',
            'correo_usuario.required' => 'Se necesita asignar un correo electronico',
            'correo_usuario.unique' => 'Este correo ya esta en uso'
        ]);

        $nuevo_usuario = new usuarios();

        $nuevo_usuario->nombre_usuario = $solicitud->input('nombre_usuario');
        $nuevo_usuario->apellido_usuario = $solicitud->input('apellido_usuario');

       /**Guardar en un directorio */
        if ($solicitud->hasFile('archivo_foto_usuario')) 
        {
            $nuevo_usuario->foto_usuario  = $solicitud->archivo_foto_usuario->store('img/usuarios', 'public');
            $solicitud->file('archivo_foto_usuario')->store( 'img/usuarios/');
        }
        else
        {
            $nuevo_usuario->foto_usuario = 'img/usarios/user.png';
        }

        
        $nuevo_usuario->alias = $solicitud->input('alias_usuario');
        $nuevo_usuario->contraseña = $solicitud->input('contraseña_usuario');
        $nuevo_usuario->telefono_usuario = $solicitud->input('telefono_usuario');
        $nuevo_usuario->correo = $solicitud->input('correo_usuario');
        $nuevo_usuario->id_tipo_usuario = $solicitud->input('tipo_usuario');
        $nuevo_usuario->id_cargo_usuario = $solicitud->input('cargo_usuario');
        $nuevo_usuario->fecha_registro = date("Y-m-d");
        $nuevo_usuario->fecha_retiro = null;
        $nuevo_usuario->respuesta_pregunta = 'hola';
        $nuevo_usuario->estado_usuario = true;
        $nuevo_usuario->save();

        return redirect('/usuarios');


    }


    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Models\usuarios $id_usuario
     * @return \Illuminate\Http\Response
     */
    public function edit(usuarios $usuario)
    {
      //  $usuario = usuarios::find($usuario);
        $tipos_usuarios = DB::table('tipos_usuarios')->where('nombre_tipo_usuario', '!=' ,'Administrador')->get();
        $cargos_usuarios = DB::table('cargos_usuarios')->get();
      
       return view('layouts/sistema/usuarios/editar_usuario', ['usuario' => $usuario, 'tipos_usuarios' => $tipos_usuarios, 'cargos_usuarios' => $cargos_usuarios]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\usuarios $user
     * @return \Illuminate\Http\Response
     */
    public function update(Request $solicitud, usuarios $usuario)
    {   
       // $usuario = usuarios::findOrFail($id_usuario);
       // dd($usuario->id_usuario);
       $valido =  $solicitud->validate([
            'estado_usuario' =>['required'],
            'archivo_foto_usuario' =>['required', 'mimes:jpeg,png, webp,jpg', 'dimensions:min_width=50,min_height=50,max_width=200,min_height=200'],

            'nombre_usuario' => ['required', 'min:3', 'max:255'],
            'apellido_usuario' =>  ['required', 'min:3', 'max:255'],

            'telefono_usuario' => ['required', 'regex:/^\s*(?:\+?(\d{1,3}))?[-. (]*(\d{3})[-. )]*(\d{3})[-. ]*(\d{4})(?: *x(\d+))?\s*$/', Rule::unique('usuarios')->ignore($usuario) ],
 

            'alias_usuario' =>  ['required','min:3','max:255',Rule::unique('usuarios')->ignore($usuario)], 

            'contraseña_usuario' =>  ['required','min:8','regex:/^.*(?=.{3,})(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[\d\x])(?=.*[!$#%]).*$/', Rule::unique('usuarios')->ignore($usuario)],

            'correo_usuario' => ['required', 'regex:/[a-z0-9._%+-]@manilastudio.com$/', /*'unique:usuarios,correo'*/ Rule::unique('usuarios')->ignore($usuario)], 

            'tipo_usuario' => 'required',
            'cargo_usuario' => 'required',
        ],  
        [
            'estado_usuario.required' => "Debe fijarse un estado para este usuario",

           'archivo_foto_usuario.required' => 'Se necesita una imagen en formato compatible',
            'archivo_foto_usuario.mimes' => 'Formato de imagen no soportado',
            'archivo_foto_usuario.dimensions' => 'La imagen debe ser de mimino 50x50 y maximo 200x200',

            'nombre_usuario.required' => 'Campo requerido, introduzca al menos 4 caracteres.',
            'nombre_usuario.min' => 'Campo requerido, introduzca al menos 4 caracteres.',

            'apellido_usuario.required' => 'Campo requerido, introduzca al menos 4 caracteres.',
            'apellido_usuario.min' => 'Campo requerido, introduzca al menos 4 caracteres.',

            'telefono_usuario.required' => 'Introduza un numero teléfonico valido',
            'telefono_usuario.regex' => 'El formato debe ser +50512345678',
            'telefono_usuario.unique' => 'Este número ya esta en uso',

            'alias_usuario.required' => 'Campo requerido, introduzca al menos 4 caracteres.',
            'alias_usuario.min' => 'Campo requerido, introduzca al menos 4 caracteres.',
            'alias_usuario.unique' => 'Esta alias ya esta en uso',

            'contraseña_usuario.required' => 'Campo requerido, introduzca al menos 8 letras, con números o caracteres',
            'contraseña_usuario.min' => 'Campo requerido, introduzca al menos 8 letras, con números o caracteres.',
            'contraseña_usuario.regex' => 'La contraseña temporal debe tener letras o números y caracteres',

            'correo_usuario.regex' => 'El correo debe usar el dominio manilastudio.com',
            'correo_usuario.required' => 'Se necesita asignar un correo electronico',
            'correo_usuario.unique' => 'Este correo ya esta en uso'
        ]);

        $usuario->nombre_usuario = $solicitud->input('nombre_usuario');
        $usuario->apellido_usuario = $solicitud->input('apellido_usuario');

       /**Guardar en un directorio */
        if ($solicitud->hasFile('archivo_foto_usuario')) 
        {
            Storage::disk('public')->delete($usuario->foto_usuario);
            $usuario->foto_usuario  = $solicitud->archivo_foto_usuario->store('img/usuarios', 'public');
            $solicitud->file('archivo_foto_usuario')->store( 'img/usuarios/');
        }
        else
        {
            $usuario->foto_usuario = 'img/usarios/user.png';
        }

       // dd($solicitud->hasFile('archivo_foto_usuario'));
        
        $usuario->alias = $solicitud->input('alias_usuario');
        $usuario->contraseña = $solicitud->input('contraseña_usuario');
        $usuario->telefono_usuario = $solicitud->input('telefono_usuario');
        $usuario->correo = $solicitud->input('correo_usuario');
        $usuario->id_tipo_usuario = $solicitud->input('tipo_usuario');
        $usuario->id_cargo_usuario = $solicitud->input('cargo_usuario');
        $usuario->fecha_registro = date("Y-m-d");

        if ($solicitud->estado_usuario == 0) 
        {
            $usuario->fecha_retiro = date("Y-m-d");
        }
        
        $usuario->respuesta_pregunta = 'hola';
        $usuario->estado_usuario = $solicitud->estado_usuario;

        $usuario->save();


    
        return redirect('/usuarios');
    }
}
...

and this is my view 

...
@section('titulo', 'Modificar datos de Usuario')
<x-master>
<div class="container-fluid mt-5">
    <div class="text-left">
        <h1 class="font-weight-bolder"> 
            Modificar Datos de Usuario
        </h1>
    </div>
    <div class="mt-5">
    <form id="formulario-agregar-usuario" class="form" method="POST" action="/usuarios/{{ $usuario->id_usuario }}" enctype="multipart/form-data">
            @csrf
            @method('PUT')
            <div class="row">
                <div class="col-sm-2">
                    <div class="border rounded p-2 bg-white">
                        <div class="border rounded">
                        <img class="border rounded-circle w-100 img-fluid mr-3" src="/storage/{{$usuario->foto_usuario}}" alt="" title="Nombre Usuario"> 
                        </div>
                    </div>
                    <br>
                    <input class="btn" type="file" name="archivo_foto_usuario">
                    @error('archivo_foto_usuario') <div class="validacion" >{{ $errors->first('archivo_foto_usuario')}}</div> @enderror
                    <div class="mt-4">
                        <input type="radio" name="estado_usuario" id="activo" value="1" @if ($usuario->estado_usuario == 1 ) checked="checked" @endif>
                        <label for="activo" class="font-weight-bolder text-uppercase text-success" >Activo</label><br>
                        <input type="radio" name="estado_usuario" id="suspender" value="0" @if ($usuario->estado_usuario == 0 ) checked="checked"@endif>
                        <label for="suspender" class="font-weight-bolder text-uppercase text-danger">Suspender</label>
                        @error('nombre_usuario') <div class="validacion" >{{ $errors->first('estado_usuario')}}</div> @enderror
                    </div>
                </div>
                <div class="col-sm-6 ml-lg-4 ml-sm-0">
                    <div class="row">
                        <div class="form-group col-md-6">
                            <label for="txtNombre_usuario" class="font-weight-bolder text-uppercase">Nombre Usuario</label>
                            <input  id="txtNombre_usuario" class="form-control" type="text" name="nombre_usuario" value="{{ $usuario->nombre_usuario }}">
                            @error('nombre_usuario') <div class="validacion" >{{ $errors->first('nombre_usuario')}}</div> @enderror
                        </div>
                        <div class="form-group col-md-6">
                            <label for="txtApellido_correo" class="font-weight-bolder text-uppercase">Apellido Usuario</label>
                            <input  id="txtApellido_usuario" class="form-control" type="text" name="apellido_usuario" value="{{ $usuario->apellido_usuario }}">
                            @error('apellido_usuario') <div class="validacion" >{{ $errors->first('apellido_usuario')}}</div> @enderror
                        </div>
                        <div class="form-group col-md-6">
                            <label for="txtTelefono_Usuario" class="font-weight-bolder text-uppercase">Telefono Usuario</label>
                            <input  id="txtTelefono_Usuario" type="tel" class="form-control" name="telefono_usuario" placeholder="ejemplo +505812345678" value="{{ $usuario->telefono_usuario }}">
                            @error('telefono_usuario') <div class="validacion" >{{ $errors->first('telefono_usuario')}}</div> @enderror
                          </div>
                        <div class="form-group col-md-6">
                            <label for="txtemail" class="font-weight-bolder text-uppercase">Correo</label>
                            <input  id="txtemail" class="form-control" type="email"  name="correo_usuario" value="{{ $usuario->correo_usuario }}">
                            @error('correo_usuario') <div class="validacion" >{{ $errors->first('correo_usuario')}}</div> @enderror
                          </div>
                          <div class="form-group col-md-6">
                            <label for="sltTipo_Usuario" class="font-weight-bolder text-uppercase">Tipo de Usuario</label>
                            <select id="sltTipo_Usuario" class="form-control" name="tipo_usuario" >
                                @foreach ($tipos_usuarios as $tipo)
                                <option value="{{$tipo->id_tipo_usuario}}" @if ($tipo->id_tipo_usuario == $usuario->id_tipo_usuario) selected="selected" @endif>{{$tipo->nombre_tipo_usuario }}</option>    
                               @endforeach
                            </select>
                          </div>                         
                          <div class="form-group col-md-6">
                            <label for="sltCargo_Usuario" class="font-weight-bolder text-uppercase">Cargo de Usuario</label>
                            <select id="sltCargo_Usuario" class="form-control" name="cargo_usuario">
                                @foreach ($cargos_usuarios as $cargo)
                                <option value="{{$cargo->id_cargo_usuario}}"  @if ($cargo->id_cargo_usuario == $usuario->id_cargo_usuario) selected="selected" @endif>{{$cargo->nombre_cargo}}</option> 
                                @endforeach 
                            </select>
                          </div>
                          <div class="form-group col-md-6">
                            <label for="txtAlias_usuario" class="font-weight-bolder text-uppercase">Alias Usuario</label>
                            <input  id="txtAlias_usuario" class="form-control" type="text" name="alias_usuario" value="@if (old('alias_usuario') !== null ) {{old('alias_usuario')}}@else {{$usuario->alias}}@endif">
                            @error('alias_usuario') <div class="validacion" >{{ $errors->first('alias_usuario')}}</div> @enderror
                        </div>
                        <div class="form-group col-md-6">
                            <label for="txtcontraseña" class="font-weight-bolder text-uppercase">Contraseña Temporal</label>
                        <input  id="txtcontraseña" class="form-control" type="password" name="contraseña_usuario" value="{{ $usuario->contraseña}}">
                            @error('contraseña_usuario') <div class="validacion" >{{ $errors->first('contraseña_usuario')}}</div> @enderror
                            <div class="validacion" ></div>
                        </div>
                    </div>
                    <div class="text-left">
                        <button type="submit" class="btn btn-primary">Modificar Usuario</button>
                    </div>
                </div>  
            </div>

          </form>
    </div>
</div>
</x-master>
Rule::unique('usuarios', 'alias')->ignore($usuario)
'name' => 'unique:users,name,' . request('id')

'telefono_usuario' => 'unique:usuarios,telefono_usuario,' . $usuario->id_usuario,