Modelos de Laravel: ¡Aprovéchelos al máximo!

modelos de laravel

Aproveche al máximo sus modelos de Laravel con estos 7 consejos

Optimización de la forma en que utiliza sus modelos de Laravel

Modelos de Laravel


Una vez que comiences a sumergirte en la documentación de Laravel, encontrarás muchas características de las que no se habla mucho en los documentos. Otras funciones se utilizan con menos frecuencia y es probable que no las conozca.

Los modelos de Laravel no son diferentes. Si observa la documentación de la API de Laravel, se sorprenderá y probablemente se sentirá abrumado por todas las propiedades y métodos que están disponibles para los modelos de Laravel.

Hay muchas funciones potentes y fáciles de usar disponibles que no todo el mundo conoce. Es exactamente por eso que repasaremos estos 7 consejos que todo desarrollador que usa este framework de PHP debe saber para aprovechar al máximo sus modelos de Laravel.


1. Tipos de elenco personalizados

Los tipos de lanzamiento personalizados se introdujeron en Laravel 7. En versiones anteriores de Laravel, estás bastante limitado en lo que respecta al lanzamiento de atributos. Solo se podía enviar a un conjunto predeterminado proporcionado por Laravel.

Aunque había algunos paquetes disponibles que implementaban la conversión personalizada, tenían un inconveniente importante. Estos paquetes anulan los métodos getAttribute y setAttribute, lo que significa que no se pueden combinar con otros paquetes que también anulan estos métodos.

Así es como usaste la propiedad casts antes de Laravel 7:

protected $casts = [
    'is_admin' => 'boolean',
    'date_of_birth' => 'date'
];

Desde Laravel 7 tienes la opción de agregar un tipo de elenco personalizado. Puede hacer esto creando una clase de conversión personalizada que implemente la interfaz CastsAttributes. Esta interfaz le obliga a implementar un método get y set.

El método get es responsable de transformar un valor bruto de la base de datos en un valor de conversión. El método set maneja la transformación de un valor de conversión en un valor bruto que se puede almacenar en la base de datos.

Así es como podría verse un tipo de conversión personalizado que maneja JSON:

<?php

namespace App\Casts;

use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

class Json implements CastsAttributes
{
    public function get($model, $key, $value, $attributes)
    {
        return json_decode($value, true);
    }

    public function set($model, $key, $value, $attributes)
    {
        return json_encode($value);
    }
}

Puede adjuntar el tipo de molde personalizado a un atributo de modelo utilizando el nombre de clase del tipo de molde personalizado.

use App\Casts\Json;// More codeprotected $casts = [
    'is_admin' => 'boolean',
    'date_of_birth' => 'date',
    'settings' => Json::class,
];

 

2. Nombres de columna de marca de tiempo personalizados

De forma predeterminada, un modelo tiene una columna created_at y updated_at que se agrega a la base de datos automáticamente. Si crea un modelo en su línea de comando usando la marca -m, también se crea una migración para este modelo.

Esta migración viene con el método timestamps () que agrega estas columnas a la base de datos. La desventaja de este método es que no puede personalizar los nombres de las columnas.

Afortunadamente, existe una manera muy fácil de cambiar los nombres de estas columnas usando las constantes CREATED_ATUPDATED_AT.

<?php

class Blog extends Model
{
    const CREATED_AT = 'created_date';
    const UPDATED_AT = 'last_update';
}

Para que esto funcione, debe eliminar $table->timestamps() y reemplazarlo con estas dos líneas de código:

$table->timestamp('created_date')->nullable();
$table->timestamp('last_update')->nullable();

Si está utilizando eliminaciones suaves para su modelo, puede usar la constante DELETED_AT para personalizar el nombre de la columna eliminada, que se ve así:

const DELETED_AT = 'deleted_date';

 

3. Guardar sin disparar eventos

Puede haber algunos casos en los que desee guardar un modelo sin activar ningún evento. Con esta función fácil pero poderosa, puede guardar cualquier modelo sin disparar eventos. Todo lo que tiene que hacer es agregar la función a continuación a su clase de modelo.

public function saveWithoutEvents()
{
    return static::withoutEvents(function() {
        return $this->save();
    });
}

Esto es lo que le gustaría guardar un modelo sin disparar eventos:

$blog = Blog::find($id);
$blog->title = "The updated title";
$blog->saveWithoutEvents();

 

4. Toque Relaciones de propiedad

Lo más probable es que ya haya usado el método táctil antes en tu modelo. Este método actualiza la marca de tiempo de actualización de los modelos de Laravel.

$blog = Blog::find($id);
$blog->touch();

¿Pero sabías que también es posible actualizar la marca de tiempo de actualización de las relaciones de propiedad del modelo?

Se puede llamar al método touchOwners en un modelo para actualizar las relaciones de propiedad del modelo. Déjame mostrarte cómo funciona esto.

Supongamos que tenemos un modelo de blog que puede tener varios comentarios. Podríamos definir una relación en el modelo de comentario que se vería así:

public function blog()
{
    return $this->belongsTo(Blog::class);
}

Dado que definimos la relación en el modelo Comment, ahora podemos usar el método touchOwners para actualizar la marca de tiempo de actualización del blog.

$comment = Comment::create([
    // Some data
]);
$comment->touchOwners();

Esto puede ser útil si queremos actualizar la marca de tiempo de actualización del blog cada vez que se agrega un nuevo comentario, por ejemplo.

 

5. Incremento

El método de incremento proporciona una forma sencilla de incrementar el valor de un campo.

CouponCode::find($id)->increment('times_used');

De forma predeterminada, el valor se incrementa en uno. Puede utilizar el segundo parámetro del método de incremento para cambiar la cantidad en la que se incrementa el valor.

El siguiente código incrementaría el valor de times_used en 10.

CouponCode::find($id)->increment('times_used', 10);

Además de incrementar la columna especificada, el método de incremento también actualizará la marca de tiempo actualizada del registro.

Es bueno saber que también existe un método de disminución que funciona exactamente de la misma manera que el método de incremento.

CouponCode::find($id)->decrement('times_used');

 

6. Valor de relación predeterminado

Tomemos el modelo de comentario de uno de los ejemplos anteriores y usémoslo también para este ejemplo. Supongamos que los usuarios pueden dejar un comentario en una publicación de blog. Si a los invitados se les permitiera comentar en una publicación de blog, la relación de usuario en el modelo de comentario devolvería null.

Para evitar que la relación de usuario devuelva un valor nulo, podríamos usar el método withDefault.

public function user()
{
    return $this->belongsTo(User::class)->withDefault([
        'name' => 'Guest',
    ]);
}

En este ejemplo, la relación de user (usuario) devuelve un modelo de usuario con el nombre guest (invitado). Al establecer un valor predeterminado para su relación, puede ayudar a eliminar las verificaciones condicionales en su código.

Esto significa que podría simplemente hacer {{ $comment->user->name }} en sus archivos de plantilla de hoja ya que la relación siempre devuelve un modelo. Si no usó el método withDefault, tendría que verificar si el comentario tiene un usuario, lo cual sería mucho más detallado.

@if ($comment->user)
    {{ $comment->user->name }}
@else
    Guest
@end

 

7. Has

El método has probablemente no necesite mucha explicación. Lo más probable es que lo esté utilizando con regularidad. El método has comprueba si existe una relación. Para seguir con el ejemplo anterior, podríamos recuperar todos los usuarios que han publicado un blog usando la siguiente línea de código:

$users = User::has('blog')->get();

Incluso podríamos ampliar este cheque. Supongamos que solo queremos obtener los usuarios que tienen al menos 5 blogs. Podemos hacerlo agregando algunos parámetros al método has.

$users = User::has('blog', '>=', 5)->get();

¿Pero sabías también que puedes conseguir a todos los usuarios que tengan al menos un blog y un comentario?

Puede anidar declaraciones de has usando la notación de puntos.

$users = User::has('blog.comment')->get();

Una pequeñ consejo extra

Bien, un último pequeño consejo para terminar este artículo. Estoy seguro de que conoce el método de find (búsqueda). Este es un método bastante básico que se usa mucho. El método de find (búsqueda) intenta devolver un modelo que coincida con la clave principal. Lo usará la mayoría de las veces de esta manera:

$blog = Blog::find(1);

Pero, ¿sabía también que es posible pasar una matriz con varios ID?

$blogs = Blog::find([1,2,3]);

Recent Post