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

在Rebing GraphQL中使用Spatie Roles库始终返回NULL

问题:GraphQL查询用户角色时getRoleNames()始终返回NULL

相关代码

所用文件

<?php

namespace App\GraphQl\Query\User;

use App\GraphQl\Traits\UserTrait;
use App\Models\User;

use GraphQL\Type\Definition\ResolveInfo;
use Rebing\GraphQL\Support\Facades\GraphQL;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Query;

GraphQL UserRolesQuery文件

use Closure;

class UserRolesQuery extends Query
{
    use UserTrait;

    protected $attributes = [
        'name' => 'user',
    ];

    public function type(): Type
    {
        return GraphQL::type('UserType');
    }

    public function args(): array
    {
        return [
            'id' => [
                'name' => 'id',
                'type' => Type::int(),
//                'rules' => ['required'] validation
            ]
        ];
    }

    public function resolve($root, array $args, $context, ResolveInfo $resolveInfo, Closure $getSelectFields)
    {
        $user = User::find($args['id']);
        $result =  $user->getRoleNames();
        return $result;
    }
}

问题排查与解决步骤

  • 确认User模型是否引入权限Trait
    如果你用的是Spatie的Laravel Permission包,User模型必须引入Spatie\Permission\Traits\HasRoles Trait,否则getRoleNames()方法不存在,调用后会返回null或报错。检查你的User模型:

    use Spatie\Permission\Traits\HasRoles;
    
    class User extends Authenticatable
    {
        use HasRoles; // 必须包含这一行
        // ...其他代码
    }
    
  • 检查用户与角色的数据库关联
    直接查看model_has_roles表,确认目标user_id对应的关联记录是否存在,且关联的role_id有效。如果数据库里没有关联数据,getRoleNames()自然返回空集合(表现为null)。

  • 处理用户不存在的情况
    User::find($args['id'])找不到用户时会返回null,此时调用getRoleNames()会触发错误,最终返回null。先判断用户是否存在:

    public function resolve($root, array $args, $context, ResolveInfo $resolveInfo, Closure $getSelectFields)
    {
        if (!isset($args['id'])) {
            return null;
        }
        
        $user = User::find($args['id']);
        if (!$user) {
            return null;
        }
        
        return $user->getRoleNames();
    }
    
  • 修正GraphQL返回类型不匹配问题
    当前Query的type()返回UserType,但getRoleNames()返回的是角色名称集合,类型不匹配会导致GraphQL解析失败,最终返回null。需要修改返回类型为字符串列表:

    public function type(): Type
    {
        return Type::listOf(Type::string()); // 返回字符串列表类型
    }
    

    若要返回完整角色结构,需定义RoleType,再返回Type::listOf(GraphQL::type('RoleType'))。

  • 确认权限包配置与迁移
    检查config/permission.php配置是否正确,确认roles、permissions、model_has_roles等表已通过迁移创建完成。

内容的提问来源于stack exchange,提问作者ahmad ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:12:46