Laravel中如何查询与指定模型存在关联关系的其他模型?
解决方案
Laravel 原生没有内置类似 $model->relationships() 的公开方法直接获取模型所有关联,你可以通过反射扫描模型方法+关联返回类型判断的方式自行实现该能力,具体实现代码如下:
实现代码
use ReflectionClass; use ReflectionMethod; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\Relation; function getModelAllRelations(Model $model): array { $relations = []; $modelReflect = new ReflectionClass($model); // 只遍历模型的公共方法 foreach ($modelReflect->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { // 过滤魔术方法、带参数的方法(关联方法默认无需传入参数) if ($method->getNumberOfParameters() > 0 || str_starts_with($method->getName(), '__')) { continue; } try { $returnValue = $method->invoke($model); // 判断返回值是否为Laravel关联类型 if ($returnValue instanceof Relation) { $relations[$method->getName()] = [ // 关联类型:HasOne/HasMany/BelongsTo等 'relation_type' => class_basename($returnValue), // 关联的目标模型完整类名 'related_model' => get_class($returnValue->getRelated()), // 关联外键 'foreign_key' => $returnValue->getForeignKeyName(), ]; } } catch (\Throwable $e) { // 忽略执行异常的非关联方法 continue; } } return $relations; }
调用示例
// 实例化你要查询的模型 $model = new \App\Models\User(); // 获取所有关联信息 $allRelations = getModelAllRelations($model); // 打印查看结果 dd($allRelations);
补充说明
- 该实现兼容Laravel 8及以上版本,低于8的版本可将
str_starts_with替换为substr($method->getName(), 0, 2) === '__'即可。 - 返回的数组键为模型中定义的关联方法名,可按需调整返回的关联字段。
- 如果项目已安装
laravel-ide-helper扩展,可直接复用其内置的关联扫描逻辑,无需自行实现反射代码。
内容的提问来源于stack exchange,提问作者Kevin Kevin
相关产品推荐
相关产品推荐

