如何在Laravel中获取指定模型的所有字段及关联关系?
Laravel模型生成php-lighthouse适配GraphQL Schema的实现方法
方法1:使用Lighthouse内置生成命令
- Lighthouse本身提供了直接从Eloquent模型生成GraphQL类型定义的官方命令,执行
php artisan lighthouse:generate:type App\Models\你的模型类名即可自动输出符合规范的Schema代码 - 该命令会自动读取模型对应数据表的字段、类型转换配置、已定义的关联关系,生成的Schema默认会引入Lighthouse对应的关联指令(如
@belongsTo、@hasMany等) - 如需批量生成所有模型的Schema,可自行编写简易Artisan命令遍历
app/Models目录下的所有模型类,循环调用上述生成命令即可
方法2:自定义脚本手动生成(适合有自定义生成规则的场景)
步骤1:获取模型数据表字段
通过Laravel的Schema门面直接读取模型对应表的所有字段,再结合模型的$casts属性映射为GraphQL标量类型:
$modelInstance = new \App\Models\YourModel(); // 获取所有字段名 $fields = \Illuminate\Support\Facades\Schema::getColumnListing($modelInstance->getTable()); // 获取字段类型映射 $casts = $modelInstance->getCasts();
你可以根据自己的需求,跳过模型$hidden属性中配置的隐藏字段,不需要暴露给GraphQL接口。
步骤2:获取模型所有关联关系
通过反射扫描模型中的公共方法,筛选出返回关联类型的方法即为模型的关联:
$reflection = new \ReflectionClass($modelInstance); $relations = collect($reflection->getMethods(\ReflectionMethod::IS_PUBLIC)) ->filter(function (\ReflectionMethod $method) { $returnType = $method->getReturnType(); return $returnType && is_subclass_of($returnType->getName(), \Illuminate\Database\Eloquent\Relations\Relation::class); });
你可以根据关联的具体子类(如HasMany、BelongsTo等),自动拼接对应的Lighthouse关联指令。
步骤3:拼接生成Schema代码
将获取到的字段、关联按照GraphQL语法规则拼接为字符串,写入graphql/types目录下对应的.graphql文件即可。
提示:如果需要支持模型中的访问器字段暴露到Schema,可额外扫描模型中以
get开头、Attribute结尾的方法,对应转换为GraphQL字段即可。
内容的提问来源于stack exchange,提问作者Muaath Alhaddad
相关产品推荐
相关产品推荐

