Laravel9 MongoDB 同集合按type字段分模型查询音频数据方案
结论
你完全不需要为音频数据新建独立collection,在共用现有媒体collection的前提下,就可以通过Laravel Eloquent的全局作用域能力,给Audio模型默认施加固定查询过滤,实现仅访问type = 'audio'记录的需求。
具体实现步骤
- 首先创建
Audio模型,你可以选择直接继承现有的Media模型,这样会自动复用Media模型已经配置好的collection连接、表名、字段类型转换等配置,不需要重复编写配置;如果不继承Media,只要在Audio模型里将$collection属性设置为和Media模型相同的collection名称即可。 - 在Audio模型的
booted方法中注册全局作用域,默认追加type = 'audio'的查询条件,示例代码如下:
<?php namespace App\Models; class Audio extends Media { protected static function booted() { // 注册全局查询作用域,默认只查音频类型数据 static::addGlobalScope('only_audio', function ($query) { $query->where('type', 'audio'); }); } }
效果说明
- 配置完成后,所有通过
Audio模型发起的查询,包括Audio::all()、条件查询、模型关联查询,都会自动带上type = 'audio'的过滤条件,不会返回视频类型的媒体记录。 - 现有
Media模型的查询逻辑完全不受影响,依然可以正常访问collection下所有音视频数据。 - 如果你在某些特殊场景需要临时绕过这个过滤,可以调用
withoutGlobalScope方法实现:
// 临时跳过音频类型过滤,拿到该collection下的所有数据 $allMedia = Audio::withoutGlobalScope('only_audio')->get();
补充说明
Laravel常用的MongoDB扩展包完全兼容Eloquent的全局作用域特性,不需要额外做适配,这种实现方式不需要做任何数据迁移,也不会改动现有存储结构,是这类单collection分类型多模型场景的标准实现方案。
内容的提问来源于stack exchange,提问作者alcolopa
相关产品推荐
相关产品推荐

