mpyw/eloquent-has-by-join
最新稳定版本:v2.0.2
Composer 安装命令:
composer require mpyw/eloquent-has-by-join
包简介
Convert has() and whereHas() constraints to join() ones for single-result relations.
README 文档
README
Convert has() and whereHas() constraints to join() ones for single-result relations.
Important
NOTICE: Postgres' optimizer is very smart and covers JOIN optimization for dependent (correlated) subqueries. Therefore, this library is mainly targeted at MySQL which has a poor optimizer.
Caution
UPDATE: MySQL's optimizer has also been updated in version 8.0.16 to include optimizations similar to PostgreSQL. This library is no longer maintained.
Requirements
- PHP:
^7.3 || ^8.0 - Laravel:
^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0
Installing
composer require mpyw/eloquent-has-by-join
Motivation
Suppose you have the following relationship:
class Post extends Model { use SoftDeletes; }
class Comment extends Model { use SoftDeletes; public function post(): BelongsTo { return $this->belongsTo(Post::class); } }
If you use has() constraints, your actual query would have dependent subqueries.
$comments = Comment::has('post')->get();
select * from `comments` where exists ( select * from `posts` where `comments`.`post_id` = `posts`.`id` and `posts`.`deleted_at` is null ) and `comments`.`deleted_at` is null
These subqueries may cause performance degradations. This package provides Illuminate\Database\Eloquent\Builder::hasByJoin() macro to solve this problem: you can easily transform dependent subqueries into simple JOIN queries.
$comments = Comment::hasByJoin('post')->get();
select `comments`.* from `comments` inner join `posts` on `comments`.`post_id` = `posts`.`id` and `posts`.`deleted_at` is null where `comments`.`deleted_at` is null
API
Signature
Illuminate\Database\Eloquent\Builder::hasByJoin(string|string[] $relationMethod, ?callable ...$constraints): $this
Arguments
$relationMethod
A relation method name that returns a BelongsTo, HasOne or MorphOne instance.
Builder::hasByJoin('post')
You can pass nested relations as an array or a string with dot-chain syntax.
Builder::hasByJoin(['post', 'author'])
Builder::hasByJoin('post.author')
You can provide table aliases with "as" syntax.
Builder::hasByJoin(['post as messages', 'author as message_authors'])
$constraints
Additional callable constraints for relations that take Illuminate\Database\Eloquent\Builder as the first argument.
Builder::hasByJoin('post', fn (Builder $query) => $query->withTrashed())
The first closure corresponds to post and the second one corresponds to author.
Builder::hasByJoin( 'post.author', fn (Builder $query) => $query->withTrashed(), fn (Builder $query) => $query->whereKey(123) )
Feature Comparison
| Feature | mpyw/eloquent-has-by-join | mpyw/eloquent-has-by-non-dependent-subquery |
|---|---|---|
| Minimum Laravel version | 5.6 | 5.8 |
| Argument of optional constraints | Illuminate\Database\Eloquent\Builder | Illuminate\Database\Eloquent\Relations\*( Builder can be also accepted by specifying argument type) |
| Compoships support | ✅ | ❌ |
| No subqueries | ✅ | ❌ (Performance depends on database optimizers) |
| No table collisions | ❌ (Sometimes you need to give aliases) | ✅ |
| No column collisions | ❌ (Sometimes you need to use qualified column names) | ✅ |
| OR conditions | ❌ | ✅ |
| Negative conditions | ❌ | ✅ |
| Counting conditions | ❌ | ❌ |
HasOne | ✅ | ✅ |
HasMany | ❌ | ✅ |
BelongsTo | ✅ | ✅ |
BelongsToMany | ❌ | ✅ |
MorphOne | ✅ | ✅ |
MorphMany | ❌ | ✅ |
MorphTo | ❌ | ❌ |
MorphMany | ❌ | ✅ |
MorphToMany | ❌ | ✅ |
HasOneThrough | ❌ | ✅ |
HasManyThrough | ❌ | ✅ |
mpyw/eloquent-has-by-join 适用场景与选型建议
mpyw/eloquent-has-by-join 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 131.72k 次下载、GitHub Stars 达 25, 最近一次更新时间为 2026 年 01 月 04 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「database」 「query」 「builder」 「laravel」 「join」 「illuminate」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 mpyw/eloquent-has-by-join 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 mpyw/eloquent-has-by-join 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 mpyw/eloquent-has-by-join 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Dibi is Database Abstraction Library for PHP
Store your language lines in the database, yaml or other sources
A package for automatically encrypting and decrypting Eloquent attributes in Laravel 5.5+, based on configuration settings.
Query filtering in your frontend
A Sphinx Query Builder extension for the Laravel Database package
Anax Database Active Record module for model classes.
统计信息
- 总下载量: 131.72k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 25
- 点击次数: 34
- 依赖项目数: 0
- 推荐数: 3
其他信息
- 授权协议: MIT
- 更新时间: 2026-01-04