Trucos para las relaciones elocuentes de Laravel

Uno de los puntos fuertes de Laravel es su elegante sintaxis. Si tiene muchos modelos y relaciones en Laravel (debido a la gran cantidad de tablas en la base de datos), el recorrido a menudo puede terminar en un código menos elegante. Con el tiempo, tres pequeñas extensiones me han resultado exitosas y me gustaría presentarles brevemente a continuación. Para hacer esto simplemente usamos algo de herencia, métodos mágicos y colecciones personalizadas.


Primero creamos un nuevo modelo en app \ ConvenienceModel.php:

b45e29b9125c2ab565b5526442437686

Entonces dejamos que todos los modelos hereden de nuestro nuevo ConvenienceModel:

b45e29b9125c2ab565b5526442437686

Mezcle sus propias funciones con las relaciones

Si desea obtener modelos conectados, use la sintaxis estándar para llamarlos:

b45e29b9125c2ab565b5526442437686

Si ahora agrega su propia lógica de negocios, le gustaría usar la notación de mayúsculas y minúsculas (inferior):

b45e29b9125c2ab565b5526442437686

Queremos estandarizar la sintaxis de ambas variantes. Para hacer esto, agregamos el método mágico __call al ConvenienceModel:

b45e29b9125c2ab565b5526442437686

Esta llamada también es posible en el ejemplo anterior.:

b45e29b9125c2ab565b5526442437686

Comprobar objetos vacíos

Si desea mostrar el nombre del país para la dirección de una persona, a menudo verá el siguiente código.:

b45e29b9125c2ab565b5526442437686

Para evitar esto, incluimos la biblioteca stringhelper y devolvemos un objeto especial de la clase vacía `empty` si no se encuentra un modelo.:

b45e29b9125c2ab565b5526442437686

Esto significa que la llamada se realizó correctamente (en este ejemplo, si se encuentra algo, se muestra el nombre del país, en todos los demás casos una cadena vacía):

b45e29b9125c2ab565b5526442437686

Si también queremos cubrir el caso de que el usuario con el ID 42 ni siquiera exista, también crearemos una pequeña función de ayuda para esto:

b45e29b9125c2ab565b5526442437686

La siguiente llamada entrega una cadena vacía incluso si el usuario no existe en absoluto:

b45e29b9125c2ab565b5526442437686

Cómodamente atravesar relaciones n: m

Finalmente, queremos simplificar el siguiente código:

b45e29b9125c2ab565b5526442437686

Para ello utilizamos la posibilidad de colecciones personalizadas . Primero estamos expandiendo el modelo de conveniencia:

b45e29b9125c2ab565b5526442437686

A continuación, creamos el archivo app\Helpers\ConvenienceCollection.php , que garantiza que cuando se llamen funciones desconocidas en Collections, la función se ejecute para todos los elementos de la colección.:

b45e29b9125c2ab565b5526442437686

Entonces podemos usar el siguiente código para generar todos los nombres de todos los países de todas las direcciones de todos los padres de la persona:

b45e29b9125c2ab565b5526442437686

Pero también son posibles llamadas como las siguientes:

b45e29b9125c2ab565b5526442437686

Ordenar por varias columnas

El siguiente comando ordena únicamente por ubicación , aunque probablemente ese no era el resultado previsto.:

b45e29b9125c2ab565b5526442437686

Para habilitar la clasificación según varias columnas, estamos ampliando nuestra colección ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

Con eso podemos ordenar la colección de acuerdo a varias columnas con:

b45e29b9125c2ab565b5526442437686

Clasificación estándar

Ampliamos la colección ConvenienceCollection con otra función auxiliar:

b45e29b9125c2ab565b5526442437686

Ahora puede darle a cada modelo una función de clasificación estándar individual:

b45e29b9125c2ab565b5526442437686

Entonces podemos ordenar una colección con:

b45e29b9125c2ab565b5526442437686

Nombres de objetos

Cada modelo implementa el método getLabel (getName varía según el modelo):

b45e29b9125c2ab565b5526442437686

Con esto, puede generar rápida y fácilmente el nombre de un objeto. A continuación, puede implementar el método auxiliar sortByLabel en ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

Resultados vacíos

Si un paso intermedio está vacío, las funciones de Laravel first () y last () generalmente devuelven cero. Por lo tanto, introducimos getFirst () y getLast () para que la siguiente llamada siempre tenga éxito:

b45e29b9125c2ab565b5526442437686

Adjunto entregamos un __empty_helper que __x reconoce:

b45e29b9125c2ab565b5526442437686

Atrás