You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 09:06:10