Refactoriza consultas usando withWhereHas

Spread the love

Cuando estoy trabajando en proyectos de Laravel, es común que necesite modelos específicos y sus relaciones. Por ejemplo, digamos que en mi proyecto, quiero recuperar solo los modelos de Usuario que realmente tienen un comentario. Para ello, tendríamos que utilizar los métodos with y whereHas juntos en nuestra consulta.

En este post vamos a echar un vistazo rápido al método withWhereHas y cómo puedes utilizarlo para sustituir las llamadas separadas a los métodos with y whereHas en tus consultas.

Usando withWhereHas()

Tomemos nuestro ejemplo anterior y digamos que queremos obtener solo los usuarios que han comentado; y también queremos obtener sus comentarios. Para ello, nuestra consulta podría ser algo como esto:

$usersWithComments = User::whereHas('comments')
    ->with('comments')
    ->get();

Sin embargo, con el nuevo método withWhereHas, podríamos mejorar la consulta de la siguiente manera:

$usersWithComments = User::withWhereHas('comments')->get();

Como puedes ver, este nuevo método proporciona algo de claridad sintáctica para ayudar a mejorar la legibilidad de nuestro código.

Uso de withWhereHas() como Callback

El método withWhereHas también admite un callback para que puedas añadir lógica adicional. Por ejemplo, si quisiéramos ampliar nuestro ejemplo de consulta anterior y obtener solo los usuarios que han aprobado comentarios (y cargar solo los comentarios aprobados), nuestro código podría ser el siguiente:

$usersWithApprovedComments = User::whereHas(
      'comments', fn ($query) => $query->where('approved', true)
  )
  ->with([
      'comments' => fn ($query) => $query->where('approved', true)
  ])
  ->get();

A continuación, podemos mejorar el código utilizando el método withWhereHas de la siguiente manera:

$usersWithApprovedComments = User::withWhereHas(
    'comments',
    fn ($query) => $query->where('approved', true)
)->get();

En mi opinión, creo que este método es una adición realmente genial que ayuda a reducir la duplicación; especialmente cuando se utilizan los callbacks en las consultas.

Conclusión

Esperamos que este breve post te haya dado una breve idea de cómo puedes utilizar el método withWhereHas en tus aplicaciones Laravel para reducir la duplicación.

Si has disfrutado leyendo este post, me encantaría que me lo comentaras. Del mismo modo, si tienes algún comentario para mejorar los futuros, también me encantaría escucharlo.

¡Sigue construyendo cosas increíbles! 🚀