0

Laravel Lighthouse GraphQL では、中間の「ピボット」テーブルからどのように情報を取得できますか?

所属するユーザーとロールがあるとします。

type User {
  roles: [Role!]! @belongsToMany
}

type Role {
  users: [User!]! @belongsToMany
}

type Query {
    user(id: ID! @eq): User @find
    role(id: ID! @eq): Role @find
}

また、中間テーブルUser_Roleに列「created_at」と「tag_id」が含まれているとします。
クエリに「created_at」を含めるにはどうすればよいですか?
が参照するタグを取得するにはどうすればよいtag_idですか?

4

1 に答える 1

7

次のようにできることがわかりました。

まず、Userモデル内のリレーションが を呼び出すことを確認して->withPivot('created_at', 'tag_id')ください:

class User extends Model {
    public function roles(): BelongsToMany
    {
        return $this->belongsToMany(\App\Models\Role::class, 'User_Role')
                    ->using(User_Role::class) // only needed to retrieve the tag from the tag_id
                    ->withPivot('created_at', 'tag_id');
    } 
}

を拡張する中間テーブルのクラスを作成しますPivot

class User_Role extends Pivot
{
    public function tag(): BelongsTo
    {
        return $this->belongsTo(\App\Models\Tag::class, 'tag_id');
    }
}

GraphQL コードを次のように変更します。

type User {
    id: ID!
    roles: [Role!] @belongsToMany
}

type Role {
    id: ID!
    pivot: UserRolePivot # this is where the magic happens
}

type UserRolePivot {
    created_at: Date!
    tag: Tag! @belongsTo
}

type Tag {
    id: ID!
    name: String!
}

これで、次のようにクエリを実行できます。

{
  users {
    id
    roles {
      id
      pivot {
        created_at
        tag {
          id
          name
        }
      }
    }
  }
}
于 2020-01-12T16:53:32.333 に答える