Laravel – Eloquent “Has”, “With”, “WhereHas” – ¿Qué significan?

He encontrado que el concepto y el significado detrás de estos métodos son un poco confusos, ¿es posible que alguien me explique cuál es la diferencia entre has y with , en el contexto de un ejemplo (si es posible)?

Con

with() es para carga ansiosa . Eso básicamente significa, a lo largo del modelo principal, que Laravel precargará la (s) relación (es) que especifiques. Esto es especialmente útil si tiene una colección de modelos y desea cargar una relación para todos ellos. Debido a que con la carga ansiosa ejecutas solo una consulta DB adicional en lugar de una para cada modelo en la colección.

Ejemplo:

User > hasMany > Post

 $users = User::with('posts')->get(); foreach($users as $user){ $users->posts; // posts is already loaded and no additional DB query is run } 

Tiene

has() es filtrar el modelo de selección en función de una relación. Por lo tanto, actúa de manera muy similar a una condición WHERE normal. Si solo usa has('relation') eso significa que solo desea obtener los modelos que tienen al menos un modelo relacionado en esta relación.

Ejemplo:

User > hasMany > Post

 $users = User::has('posts')->get(); // only users that have at least one post are contained in the collection 

Donde tiene

whereHas() funciona básicamente igual que has() pero le permite especificar filtros adicionales para que el modelo relacionado lo revise.

Ejemplo:

User > hasMany > Post

 $users = User::whereHas('posts', function($q){ $q->where('created_at', '>=', '2015-01-01 00:00:00'); })->get(); // only users that have posts from 2015 on forward are returned