Laravel - elocuente tiene, con, dónde está

Laravel - elocuente tiene, con, dónde está

Problema

tiene, con y donde tiene a veces puede ser confuso para los desarrolladores principiantes. Damos una perspectiva sobre lo que significan cada uno de esos

Solución

con() se usa generalmente con una carga ansiosa, que es una forma rápida de extraer modelos relacionados. Básicamente, significa que, junto con el modelo principal, Laravel precargará las relaciones enumeradas. Esto es beneficioso cuando necesita cargar datos adicionales y desea evitar hacer N+1 Db malas prácticas. Con una carga ansiosa, solo ejecuta una consulta de DB adicional en lugar de potencialmente cientos de consultas adicionales.

Ejemplo:

Usuario> Hasmany> Organización
$ users = user :: con ('organizaciones')-> get ();
foreach ($ ussers como $ user)
$ Usuarios-> Organizaciones; // Las publicaciones ya están cargadas y no se ejecuta una consulta de DB adicional

Tiene

tiene() se utiliza para filtrar el modelo de selección basado en la relación seleccionada. Es básicamente un método de relaciones. Si solo usas tiene ('organización'), Usando el mismo ejemplo de usuarios y organizaciones, significaría que atraerá a todos los usuarios que tienen al menos una organización en su 'cartera'.

Ejemplo:

Usuario> Hasmany> Organización
$ users = user :: ha ('' organizaciones ')-> get ();
// Solo los usuarios que tienen al menos una organización en su cartera son
contenido en la colección

Donde tiene

donde tiene() es casi lo mismo que tiene(). Solo le permite especificar filtros adicionales para el modelo relacionado que se verifica.

Ejemplo:

Usuario> Hasmany> Organización
$ users = user :: wherehas ('organizaciones', función ($ q)
$ Q-> Where ('Create_at', '> =', '2020-01-01 00:00:00');
)-> get ();
// Solo se devuelven los usuarios que tienen organizaciones creadas al comienzo de 2020 en adelante