Laravel-Elocuente "Tiene", "Con", "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)?

Author: lukasgeiter, 2015-05-14

1 answers

Con

with() es para carga ansiosa. Eso básicamente significa que, a lo largo del modelo principal, Laravel precargará las relaciones que especifique. Esto es especialmente útil si tiene una colección de modelos y desea cargar una relación para todos ellos. Porque con eager loading solo se ejecuta una consulta de base de datos adicional en lugar de una para cada modelo de 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 selección del modelo basado en una relación. Así que actúa de manera muy similar a una condición normal DONDE. 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 el modelo relacionado a comprobar.

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
 332
Author: lukasgeiter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-25 07:07:52