() 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!