如何在 Apollo 中将一张表关联到另一张表

Posted

技术标签:

【中文标题】如何在 Apollo 中将一张表关联到另一张表【英文标题】:How to associate one table to another in Apollo 【发布时间】:2019-09-21 03:02:54 【问题描述】:

我在一个数据库中有两个表。球队和联赛。通过 Apollo,我有一个 CREATE_TEAM_MUTATION 用于保存到数据库,还有一个 ALL_LEAGUES_QUERY 用于检索每个联赛名称以将选项填充为表单中的选择。

但是当我保存时,我得到了错误:

变量“$_v0_data”的值无效 "league":"","name":"Sample Team","number":1;预期类型 LeagueCreateOneInput 是 value.league 中的对象。

我想了解这里的数据流。我的意图是将所选联赛的 id 保存为 teams 表中每支球队的列条目(联赛)。

这是我在后端的 prisma 数据模型

type League 
  id: ID! @unique
  name: String!
  description: String


type Team 
  id: ID! @unique
  name: String!
  number: Int!
  league: League

这是我在后端的 createTeam Mutation:

async createTeam(parent, args, ctx, info)         
    // create the user in the database
    const team = await ctx.db.mutation.createTeam(
      
        data: 
          league: 
            connect: 
              id: ctx.request.leagueId
            
          ,
          ...args,          
        ,
      ,
      info
    );
    return team;
  ,

这是我来自前端的查询和变异:

const CREATE_TEAM_MUTATION = gql`
  mutation CREATE_TEAM_MUTATION(
    $name: String!
    $number: Int
    $league: String    
  ) 
    createTeam(
      name: $name
      number: $number
      league: $league      
    ) 
      id
    
  
`;

const ALL_LEAGUES_QUERY = gql`
  query ALL_LEAGUES_QUERY 
    leagues 
      id
      name
      description
    
  
`;

这是我的渲染():

render()     
    return (
      <Mutation mutation=CREATE_TEAM_MUTATION variables=this.state>
        (createTeam,  loading, error ) => (
          <Form
            onSubmit=async e => 
              // Stop the form from submitting
              e.preventDefault();
              // call the mutation
              const res = await createTeam();
              // change them to the single team page
              console.log(res);
              Router.push(
                pathname: '/team',
                query:  id: res.data.createTeam.id ,
              );
            
          >
            <Error error=error />
            <fieldset disabled=loading aria-busy=loading>              
              <label htmlFor="name">
                Name
                <input
                  type="text"
                  id="name"
                  name="name"
                  placeholder="Team Name"
                  required
                  value=this.state.name
                  onChange=this.handleChange
                />
              </label>

              <label htmlFor="number">
                Number
                <input
                  type="number"
                  id="number"
                  name="number"
                  placeholder="Team Number"                 
                  value=this.state.number
                  onChange=this.handleChange
                />
              </label>
              <label htmlFor="league">
                League
                <Query query=ALL_LEAGUES_QUERY>               
                  ( data, error, loading ) => 
                    console.log('data', data);
                    if (loading) return <p>Loading...</p>
                    if (error) return <p>Error... error.message</p>
                    return (                      
                      <select id="league"
                        name="league"
                        value=this.state.league
                        onChange=this.handleChange>
                        data.leagues.map((league) => (

                          <option key=league.id value=league.id>league.name</option> 
                        ))
                      </select>                                                                 
                    )
                  
                </Query>
              </label>              
              <button type="submit">Create Team</button>
            </fieldset>
          </Form>
        )
      </Mutation>
    );
  

【问题讨论】:

【参考方案1】:

感谢 Slack 论坛的几个人,终于找到了答案。在这里发布它,希望它可以帮助遇到同样事情的其他人:

这是旧代码:

async createTeam(parent, args, ctx, info)         
    // create the user in the database
    const team = await ctx.db.mutation.createTeam(
      
        data: 
          league: 
            connect: 
              id: ctx.request.leagueId
            
          ,
          ...args,          
        ,
      ,
      info
    );
    return team;
  ,

这是新的:

const params = ...args;
    delete params.league;
    const team = await ctx.db.mutation.createTeam(
      
        data: 
          league: 
            connect: 
              id: args.league
            
          ,
          ...params          
        ,
      ,
      info
    );
    return team;
  ,

所以你看我有两个问题。

首先,id: ctx.request.leagueId 需要是 id: id: args.league

其次,我两次在联赛中传球。一次通过连接,再一次通过 ...args 传播。那是实际上导致错误的原因。因此,创建一个参数 var,将 args 传播传递给它,然后从参数中删除联赛,然后它就起作用了。

【讨论】:

以上是关于如何在 Apollo 中将一张表关联到另一张表的主要内容,如果未能解决你的问题,请参考以下文章

sql如何将一个表与另外一张表相关联

在oracle中怎么把一张表的数据插入到另一张表中

Oracle查询表结果添加到另一张表中

如何将一张表复制到另一张表

如何将数据从一张表导入到另一张表 - SpringBoot JPA /MySQL

如何使用复制命令在 postgres 中将数据从一个表复制到另一个表