15. Mutadores y Accesores

Los mutadores te permiten modificar los valores de los atributos antes de guardarlos en la base de datos, mientras que los accesores te permiten acceder a los valores de los atributos de manera formateada. En este capítulo, te enseñaremos cómo definir mutadores y accesores en tus modelos Eloquent, cómo utilizarlos para modificar y acceder a los valores de los atributos y cómo utilizar los mutadores y accesores en las vistas de tu aplicación. Además, conocerás cómo utilizar los mutadores y accesores para encriptar y desencriptar datos sensibles, y cómo utilizarlos para formatear los valores de fecha y hora. Con estos conocimientos, podrás modificar y acceder a los valores de los atributos de tus modelos Eloquent de manera controlada en tus aplicaciones Laravel utilizando mutadores y accesores.


10 comentarios

Inicia sesión para comentar

Comentarios:

  • Felix Moreno

    Felix Moreno hace 10 meses

    Hola a todos

    No me funcionan, ni los mutadores ni los accesores, no los transforma, no da error ni nada, pero no hace la transformación, he probado las diferentes formas que indican en el curso y las de los compañeros pero sigo igual. Graba la información tal y como la escribo y a la hora de mostrarla, la muestra tal y como esta en la base de datos

    ¿Saben que puede pasar?

    Un saludo

    • Victor Arana Flores hace 10 meses

      Hola Felix, es probable que estes importando otra definicion de Attribute, y no la correspondiente a eloquent

    • Felix Moreno hace 10 meses

      Le echare un ojo

      Me esta encantando del curso :-)

    • Edgar Soto hace 10 meses

      Borra cache, a mi me funcionó. 

      php artisan cache:clear

       

    • Gonzalo Chable hace 5 meses

      Me pasó lo mismo y funcionó con esta solución, gracias, saludos

  • Martzdev

    Martzdev hace 1 año

        protected function autor(): Attribute
        {
            return Attribute::make(set: fn ($value) => strtolower($value));
        }
    
    
        protected function titulo(): Attribute
        {
            return new Attribute(
                set: function ($value) {
                    return strtolower($value);
                }
            );
        }
  • Victoria León Estañol

    Victoria León Estañol hace 2 años

    Hola, Como se llama la extension que estas usando para que te acomplete la información?

    • Victor Arana Flores hace 2 años

      Uso varios, los voy mencionando a lo largo de todo el curso.

    • Krozz hace 1 año

      He instalado las que mencionas en el curso, pero no me autocompleta como en este video cuando haces las funciones

  • Juan Hernandez

    Juan Hernandez hace 2 años

    Para los que tengan error yo lo solucione con el comentario que puso @Johaan Sting pero también me salí de tinker y lo Inicie de nuevo el tinker y ya me guarda en minúscula 
    PD: yo hice la prueba con el correo, en vez de name le cambie a email.

  • Johann Stig

    Johann Stig hace 2 años

    Hola Victor, no me funcionó de la forma que lo hiciste ni tampoco por la sugerida por Gerardo Vera. También estoy usando Laravel 9. Qué puede estar pasando ?

  • Gerardo Vera Velasco

    Gerardo Vera Velasco hace 2 años

    No sé por qué no me funcionó pero lo hice de otra forma, y ya funcionó. Estoy trabajando con Laravel Sail (Laravel 9), no sé si tenga algo que ver, de igual forma les comparto la manera en que lo hice.

     

    use Illuminate\Database\Eloquent\Casts\Attribute;

    protected function name(): Attribute{

    return Attribute::make(
     

    get: fn ($value) => ucwords($value),

    set: fn ($value) => strtolower($value)

    );

    }

  • Edgardo

    Edgardo hace 2 años

    Me gusta tu estilo de explicar calmadamente, vengo de un curso de Laravel que me estresó por ser de la versión 6 y mas encima el profesor hablaba como si tratara con expertos.

    • Victor Arana Flores hace 2 años

      Me alegra que te guste el curso :D

  • Walter

    Walter hace 2 años

    ? La información que vamos a almacenar en nuestra BD, la mayoría de las veces, va a llegar desde formularios.

     

    ? Mutadores

          Se colocan dentro de los Modelos encargados de almacenar la información que les llega y transformarla antes de guardarla.

          Para agregar un mutador lo primero es agregar en el Modelo User.php en la parte de arriba una definición: 

    use Illuminate\Database\Eloquent\Casts\Attribute;

          Luego incluimos un método dentro de la clase User, debe tener el mismo nombre que el atributo que quiera modificar.

    	protected function name(): Attribute 
    	{
    		return new Attribute(
    			set: function($value) {
    				return strtolower($value);
    			}
    		);
    	}

     

    ? Accesores

          Hace el proceso inverso que los mutadores, es decir, cuando recuperamos información de la BD la modifica antes de presentarla.

          En el mismo lugar donde agregamos set: ahora añadimos:

    get: function($value) {
    	return ucwords($value);
    }

          Podemos usar la notación de función flecha: 

    get: fn($value) => ucwords($value)

     

    ? Formas legacy que podemos encontrar para las definiciones de mutadores y accesores

    public function setNameAttribute($value) {
    	$this->attributes['name'] = strtolower($value);
    }
    
    public function getNameAttribute($value) {
    	return ucwords($value);
    }

     

  • Francisco Peña

    Francisco Peña hace 2 años

    El mejor profesor de Laravel de todos los que vi

    • Victor Arana Flores hace 2 años

      Gracias Francisco

  • Daniel Torres

    Daniel Torres hace 2 años

    Tener en cuenta que esta clase es para Laravel 9. Al final se explica cómo realizarlo para versiones anteriores al 9.

    • David Sanchez hace 2 años

      A mi me da error en cualquiera de las 2 formas, tengo laravel 8

      return new Attribute(


       

                      set: fn($value) =>strtolower($value)


       

                     


       

                );

      muestra este error: syntax error, unexpected ':', expecting ')'

      Ver el problema


       

    • Emerson Daniel Machado Alvarez hace 2 años

      En el get de arriba debes terminarlo con , no con ; ese es el error