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 muchas tablas en la base de datos), atravesar a menudo puede terminar en un código menos elegante. Con el paso del tiempo, tres pequeñas extensiones han demostrado su utilidad para mí, que quiero presentar brevemente a continuación. Solo usamos 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

Por tanto, esta llamada también es posible en el ejemplo anterior:

b45e29b9125c2ab565b5526442437686

Comprobar objetos vacíos

Si desea enviar el nombre del país a una dirección personal, 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 vacío si no se encuentra un modelo:

b45e29b9125c2ab565b5526442437686

Esto también hace que la llamada sea exitosa (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

Luego creamos el archivo app \ Helpers \ ConvenienceCollection.php , que asegura que llamar a funciones desconocidas en colecciones ejecute la función 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

La siguiente llamada solo ordena por ubicación , aunque probablemente no era lo que deseaba:

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