Web Analytics

hasin

⭐ 152 stars Spanish by biiiiiigmonster

English | 中文

LARAVEL HASIN

Última versión en Packagist Estado de la acción de pruebas en GitHub Estado de la acción de estilo de código en GitHub Estado de cobertura Calidad del código en Scrutinizer Descargas totales

El paquete hasin es un paquete de composer basado en la sintaxis where in para consultar la relación del laravel ORM, que puede reemplazar has basado en la sintaxis where exists en algunos escenarios de negocio para obtener un mayor rendimiento.

Instalación

| Versión de Laravel | Comando de instalación | |--------------------|----------------------------------------------------| | Laravel 12 | `` composer require biiiiiigmonster/hasin:^5.0 ` | | Laravel 11 | ` composer require biiiiiigmonster/hasin:^4.0 ` | | Laravel 10 | ` composer require biiiiiigmonster/hasin:^3.0 ` | | Laravel 9 | ` composer require biiiiiigmonster/hasin:^2.0 ` | | Laravel 5.5 ~ 8 | ` composer require biiiiiigmonster/hasin:^1.0 ` |

Introducción

La relación del laravel ORM es muy poderosa, y la consulta has basada en la relación también nos ofrece muchos métodos de llamada flexibles. Sin embargo, en algunos casos, has se implementa con sintaxis de where exists.

Por ejemplo:

// User hasMany Post
User::has('posts')->get();
#### select from users where exists (select from posts where users.id = posts.user_id)
'exists' es un bucle hacia la tabla externa, y luego consulta la tabla interna (subconsulta) cada vez. Debido a que el índice se usa para la consulta de la tabla interna (la tabla interna es eficiente, por lo que puede usarse como tabla grande), y cuánto de la tabla externa necesita ser recorrida, es inevitable (intenta usar una tabla pequeña), por lo que el uso de exists para la tabla interna grande puede acelerar la eficiencia.

Cuando la tabla User tiene una gran cantidad de datos, habrá problemas de rendimiento, por lo que la sintaxis where in mejorará mucho el rendimiento.

#### select * from users where users.id in (select posts.user_id from posts)

'in' es para conectar en hash la tabla externa y la interna, primero consulta la tabla interna, luego coincide el resultado de la tabla interna con la externa, y usa el índice para la tabla externa (la externa es eficiente, y se pueden usar tablas grandes). La mayoría de las tablas internas necesitan ser consultadas, lo cual es inevitable. Por lo tanto, usar 'in' con una tabla externa grande puede acelerar la eficiencia.

Por lo tanto, el uso de has(hasMorph) o hasIn(hasMorphIn) en el código debe determinarse según el tamaño de los datos

/
 
  • SQL:
select from
users
  • where exists
  • (
select from
posts
  • where users.id = posts.user_id
  • )
  • limit 10 offset 0
*/ $users = User::has('posts')->paginate(10);

/

  • SQL:
select from
users
  • where users.id in
  • (
  • select posts.user_id from posts
  • )
  • limit 10 offset 0
*/ $users = User::hasIn('posts')->paginate(10);

Ejemplo de uso

hasIn(hasMorphIn) soporta todas las Relations en el ORM de laravel. El modo de llamada y la implementación interna son completamente consistentes con has(hasMorph) del framework.

hasIn

// hasIn
User::hasIn('posts')->get();

// orHasIn User::where('age', '>', 18)->orHasIn('posts')->get();

// doesntHaveIn User::doesntHaveIn('posts')->get();

// orDoesntHaveIn User::where('age', '>', 18)->orDoesntHaveIn('posts')->get();

whereHasIn

// whereHasIn
User::whereHasIn('posts', function ($query) {
    $query->where('votes', '>', 10);
})->get();

// orWhereHasIn User::where('age', '>', 18)->orWhereHasIn('posts', function ($query) { $query->where('votes', '>', 10); })->get();

// whereDoesntHaveIn User::whereDoesntHaveIn('posts', function ($query) { $query->where('votes', '>', 10); })->get();

// orWhereDoesntHaveIn User::where('age', '>', 18)->orWhereDoesntHaveIn('posts', function ($query) { $query->where('votes', '>', 10); })->get();

tieneMorphIn

Image::hasMorphIn('imageable', [Post::class, Comment::class])->get();

Relación Anidada

User::hasIn('posts.comments')->get();

Pruebas

composer test
>Consejos: antes de realizar las pruebas, necesita configurar la conexión a su base de datos en el archivo
phpunit.xml.dist`.

Licencia

MIT

--- Tranlated By Open Ai Tx | Last indexed: 2026-02-11 ---