Laravel Query Builder中wherePivotNotIn实现及核心文件修改安全性咨询
关于修改Laravel核心类添加
wherePivotNotIn的疑问解答 直接修改核心框架文件安全吗?
答案是非常不推荐,甚至可以说存在诸多风险:
- 首先,
vendor目录是Composer负责维护的依赖目录,团队协作场景下这个目录通常不会提交到Git,你的修改无法同步给其他成员,只会导致本地可用、其他人拉取代码后直接报错。 - 其次,Laravel核心代码经过官方严格测试,修改核心类可能引入隐性的兼容性问题。比如你添加的方法暂时能用,但如果后续框架调整了
pivotWhereIns数组的用途或者whereNotIn的参数逻辑,你的自定义代码很可能引发难以排查的bug。 - 最后,这种修改完全不符合Laravel的扩展规范,会让项目和特定版本的框架深度绑定,后续升级框架时的风险极高。
框架更新后修改会丢失吗?
百分百会丢失。当你执行composer update或者重新composer install时,Composer会从官方仓库拉取最新的框架代码,直接覆盖vendor/laravel/framework下的所有文件,你之前添加的wherePivotNotIn方法会被彻底清除,毫无保留。
更稳妥的替代方案
既然官方没提供这个方法,我们可以用Laravel的**宏扩展(Macroable)**来实现,完全不用碰核心文件:
- 打开
app/Providers/AppServiceProvider.php,在boot方法里添加以下代码:
use Illuminate\Database\Eloquent\Relations\BelongsToMany; public function boot() { BelongsToMany::macro('wherePivotNotIn', function ($column, $values, $boolean = 'and', $not = false) { $this->pivotWhereIns[] = func_get_args(); return $this->whereNotIn($this->table.'.'.$column, $values, $boolean, $not); }); }
- 保存后,你就可以像使用官方方法一样在关联关系里调用
wherePivotNotIn了,效果和你之前修改核心文件完全一致,但这种方式不会破坏框架结构,后续框架升级时只要BelongsToMany的基础API没发生大变动,这个宏就能正常工作。
内容的提问来源于stack exchange,提问作者Atnaize
相关产品推荐
相关产品推荐

