Advertisement
  1. Code
  2. Laravel

Mutadores y Accesores Elocuentes en Laravel

Scroll to top
Read Time: 7 min

() translation by (you can also view the original English article)

En este artículo, veremos los mutadores y los accesores del ORM Eloquent en el marco web de Laravel. Después de la introducción, veremos algunos ejemplos para comprender estos conceptos.

En Laravel, los mutadores y los elementos de acceso le permiten modificar los datos antes de guardarlos y recuperarlos de una base de datos. Para ser específico, el mutador le permite modificar los datos antes de que se guarden en una base de datos. Por otro lado, el descriptor de acceso le permite modificar los datos después de que se recuperan de una base de datos.

De hecho, el modelo Laravel es el lugar central donde puede crear métodos de acceso y mutador. Y, por supuesto, es bueno tener todas sus modificaciones en un solo lugar en lugar de dispersas en diferentes lugares.

Crear accesores y mutadores en una clase de modelo

Como ya está familiarizado con el concepto básico de mutadores y accesores, seguiremos adelante y desarrollaremos un ejemplo del mundo real para demostrarlo.

Supongo que está al tanto del modelo Eloquent en Laravel, y usaremos el modelo Post como punto de partida de nuestro ejemplo. Si aún no ha creado el modelo de publicación, usemos el comando artisan para crearlo.

1
php artisan make:model Post --migration

Eso debería crear un archivo modelo en app / Post.php como se muestra a continuación.

1
<?php
2
3
namespace App;
4
5
use Illuminate\Database\Eloquent\Model;
6
7
class Post extends Model
8
{
9
    //

10
}

Vamos a reemplazar el contenido de ese archivo con lo siguiente.

1
<?php
2
namespace App;
3
4
use Illuminate\Database\Eloquent\Model;
5
6
class Post extends Model
7
{
8
    /**

9
     * The attributes that should be mutated to dates.

10
     *

11
     * @var array

12
     */
13
    protected $dates = [
14
        'created_at',
15
        'updated_at',
16
        'published_at'
17
    ];
18
19
    /**

20
     * Get the post title.

21
     *

22
     * @param  string  $value

23
     * @return string

24
     */
25
    public function getNameAttribute($value)
26
    {
27
        return ucfirst($value);
28
    }
29
    
30
    /**

31
     * Set the post title.

32
     *

33
     * @param  string  $value

34
     * @return string

35
     */
36
    public function setNameAttribute($value)
37
    {
38
        $this->attributes['name'] = strtolower($value);
39
    }
40
}

Como hemos utilizado la opción --migration, también debería crear una migración de base de datos asociada. En caso de que no lo sepa, puede ejecutar el siguiente comando para que realmente cree una tabla en la base de datos

1
php artisan migrate

Para ejecutar ejemplos en este artículo, debe crear las columnas name y publish_at en la tabla de publicaciones. De todos modos, no entraremos en los detalles del tema de la migración, ya que está fuera del alcance de este artículo. Así que volveremos a los métodos que nos interesan.

En primer lugar, vamos a pasar por el método mutador.

1
/**

2
  * Set the post title.

3
  *

4
  * @param  string  $value

5
  * @return string

6
  */
7
public function setNameAttribute($value)
8
{
9
    $this->attributes['name'] = strtolower($value);
10
}

Como vimos anteriormente, los mutadores se utilizan para modificar los datos antes de que se guarden en una base de datos. Como puede ver, la sintaxis del método del mutador está establecida en {atributo-nombre} Atributo. Por supuesto, debe reemplazar {nombre-atributo} con un nombre de atributo real.

Se llama al método setNameAttribute antes de que el valor del atributo de nombre se guarde en la base de datos. Para mantener las cosas simples, solo hemos utilizado la función strtolower que convierte el título de la publicación en minúsculas antes de que se guarde en la base de datos

De esta manera, podría crear métodos mutadores en todas las columnas de su tabla. A continuación, vamos a pasar por el método de acceso.

Si se usan mutadores para alterar los datos antes de que se guarden en una base de datos, el método de acceso se usa para alterar los datos después de que se recuperan de una base de datos. La sintaxis del método de acceso es la misma que la del mutador, excepto que comienza con la palabra clave get en lugar de la palabra clave set.

Vayamos a través del método de acceso getNameAttribute.

1
/**

2
  * Get the post title.

3
  *

4
  * @param  string  $value

5
  * @return string

6
  */
7
public function getNameAttribute($value)
8
{
9
    return ucfirst($value);
10
}

Se llamará al método getNameAttribute después de que el valor del atributo de nombre se obtenga de la base de datos. En nuestro caso, acabamos de usar el método ucfirst para modificar el título de la publicación.

Y esa es la forma en que se supone que debes usar los accesores en tus modelos. Hasta ahora, acabamos de crear métodos mutadores y de acceso, y los probaremos en la próxima sección.

Mutadores en Acción

Vamos a crear un controlador en app / Http / Controllers / MutatorController.php para que podamos probar el método mutador que creamos en la sección anterior.

1
<?php
2
// app/Http/Controllers/MutatorController.php

3
namespace App\Http\Controllers;
4
5
use App\Post;
6
use App\Http\Controllers\Controller;
7
8
class MutatorController extends Controller
9
{
10
    public function index()
11
    {
12
        // create a new post object

13
        $post = new Post;
14
        $post->setAttribute('name', 'Post title');
15
        $post->save();
16
    }
17
}

Además, debe crear una ruta asociada en el archivo route / web.php para acceder a ella.

1
Route::get('mutator/index', 'MutatorController@index');

En el método de índice, estamos creando una nueva publicación utilizando el modelo de publicación. Debería establecer el valor de la columna de nombre para publicar el título, ya que hemos utilizado la función strtolower en el método mutador setNameAttribute.

Fecha mutadores

Además del mutador del que hablamos anteriormente, el modelo Eloquent proporciona un par de mutadores especiales que le permiten modificar los datos. Por ejemplo, el modelo Eloquent en Laravel viene con una propiedad especial $ dates que le permite convertir automáticamente las columnas deseadas en una instancia de fecha de carbono.

Al principio de este artículo, creamos el modelo de publicación, y el siguiente código era parte de esa clase.

1
...
2
...
3
/**

4
 * The attributes that should be mutated to dates.

5
 *

6
 * @var array

7
 */
8
protected $dates = [
9
    'created_at',
10
    'updated_at',
11
    'published_at'
12
];
13
...
14
...

Como probablemente sepa, Laravel siempre crea dos campos relacionados con la fecha, created_at y updated_at, con cada migración de base de datos. Y también convierte esos valores en una instancia de fecha de carbono.

Supongamos que tiene un par de campos en una tabla que le gustaría tratar como campos de fecha. En ese caso, solo necesita agregar nombres de columna en la matriz $ dates

Como puede ver en el código anterior, hemos agregado la columna publish_at en la matriz $ dates y se asegura de que el valor de esa columna se convertirá en una instancia de fecha de carbono.

Accesores en Acción

Para ver los accesores en acción, avancemos y creamos una aplicación de archivo de controlador / Http / Controllers / AccessorController.php con el siguiente contenido.

1
<?php
2
namespace App\Http\Controllers;
3
4
use App\Post;
5
use App\Http\Controllers\Controller;
6
7
class AccessorController extends Controller
8
{
9
    public function index()
10
    {
11
        // load post

12
        $post = Post::find(1);
13
        
14
        // check the name property

15
        echo $post->name;
16
        
17
        // check the date property

18
        echo $post->published_at;
19
        
20
        // as we've mutated the published_at column as Carbon date, we can use following as well

21
        echo $post->published_at->getTimestamp();
22
        exit;
23
    }
24
}

Además, vamos a crear una ruta asociada en el archivo route / web.php para acceder a ella.

1
Route::get('accessor/index', 'AccessorController@index');

En el método de índice, hemos utilizado el modelo de publicación para cargar una publicación de ejemplo en primer lugar.

A continuación, estamos inspeccionando el valor de la columna de nombre, y debe comenzar con una letra mayúscula, ya que ya hemos definido el método de acceso getNameAttribute para esa columna.

Avanzando más, hemos inspeccionado el valor de la columna publish_at, y eso debería tratarse como una fecha. Debido a eso, Laravel lo convierte en una instancia de Carbon para que pueda usar todos los métodos de utilidad proporcionados por esa biblioteca. En nuestro caso, hemos utilizado el método getTimestamp para convertir la fecha en una marca de tiempo.

¡Y eso nos lleva al final de este artículo!

Conclusión

Hoy, hemos explorado los conceptos de mutadores y accesores de la ORM Eloquent en Laravel. Proporciona una buena manera de alterar los datos antes de guardarlos y recuperarlos de una base de datos.

Para aquellos de ustedes que ya están comenzando con Laravel o que desean ampliar sus conocimientos, sitio o aplicación con extensiones, tenemos una variedad de cosas que puede estudiar en Envato Market.

¡No dudes en compartir tus pensamientos usando los comentarios abajo!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.