是否可以使用 GraphQLList 从多个表中获取数据

Posted

技术标签:

【中文标题】是否可以使用 GraphQLList 从多个表中获取数据【英文标题】:Is it possible to fetch data from multiple tables using GraphQLList 【发布时间】:2019-08-02 16:11:21 【问题描述】:

在 GraphQL 中,我们可以在 GraphQLList 中编写对象类型并获取所有字段。我正在使用 Association 并且它正在加入两个表,但我无法获取两个表的字段。它只需要我在 GraphQLList 中编写的字段。因为我想要数据列表。

这里是代码

films table:

    module.exports =(sequelize, DataTypes) => 
  const films = sequelize.define(
    'films',
    
      id:
        type: DataTypes.INTEGER,
        primaryKey: true,
        allowNull: false,

      ,
      name: 
        type: DataTypes.STRING,

      ,
      ,

  );

  films.associate = (models) => 


    films.hasMany(models.movie_stream, 
      foreignKey: 'movie_id',
    );

;

  return films;



movie_stream table:

    module.exports = (sequelize, DataTypes) => 
  const movie_streams = sequelize.define('movie_streams', 
    id:
      type: DataTypes.INTEGER,
      primaryKey: true,
      allowNull: false,
    ,
      movie_id: 
          type: DataTypes.STRING,
          foreignKey: "movie_id",

        ,
     );

  movie_streams.associate = (models) => 

    movie_streams.hasMany(models.films, 
      foreignKey: 'id',
    );
  ;

  return movie_streams;
;

Schema file:

movieList:
      type: new GraphQLList(Films),
 resolve: (parent,args)=>
return newdb.films.findAll(attributes:['id','name','permalink'],
where: content_category_value:parent.id ,
include: [
    model:newdb.movie_stream,
    attributes:['id','movie_id'],
],
).then(data=>
    return data;
)

我可以在这里输入:new GraphQLList(Films, MovieStream) 吗?

我试过了,但它不起作用。请给我一些想法如何获取两个表的字段???

【问题讨论】:

【参考方案1】:

在 GraphQL 中有两种主要的实现方式:联合和接口。

接口是 GraphQL 架构中的两个或多个对象类型共享某些字段(特征)的地方。例如,您的商店中的所有商品可能都有一个Product 接口,其中每个产品都有一个pricebarcodeshelfLocation。您的所有产品,例如ShampooBreadLawnChair,都将实现此接口。

interface Product 
  price: Float
  barcode: Int
  shelfLocation: ShelfLocation


type Bread implements Product 
  price: Float
  barcode: Int
  shelfLocation: ShelfLocation
  brand: String
  numberOfSlices: Int
  calories: Float
  bestBefore: Date


extend type Query 
  searchProducts(phrase: String!): [Product!]

联合是您声明某事物可以返回多个对象类型的地方,但这些类型不必具有任何共同的属性。

type Shark 
  name: String
  numberOfTeeth: Int


type Shoe 
  brand: String
  size: String


union SharkOrShoe = Shark | Shoe

extend type Query 
  searchSharksAndShoes(phrase: String!): [SharkOrShoe!]

在这两种情况下,您都可以使用片段或内联片段查询类型特定的字段:

query 
  searchProducts(phrase: "tasty") 
    # shared fields
    __typename
    price
    barcode
    shelfLocation  aisle, position 

    # type specific fields
    ... on Bread  brand 
    ...breadFrag
  
  searchSharksAndShoes(phrase: "sleek") 
    # only the introspection fields are shared in a union
    __typename

    # type specific fields
    ... on Shark  name, numberOfTeeth 
    ...shoeFrag
  


fragment breadFrag on Bread 
  barcode
  bestBefore


fragment shoeFrag on Shoe 
  brand
  size

您可以在 GraphQL schema documentation 中了解更多信息,并在 GraphQL.js 文档中阅读 GraphQLInterfaceType 和 GraphQLUnionType。

【讨论】:

可以在node js中做吗? 是的;答案底部的链接指向您将在 Node.js 中使用的 GraphQL.js 文档。

以上是关于是否可以使用 GraphQLList 从多个表中获取数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL 从多个表中选择 *

GraphQL:如何实现 GraphQLObjectTypes 的 GraphQLList

仅从 GraphQLList 对象返回非空值

如何从SQL表中选择特定行并在SQL Server中连接多个表?

[GraphQL] Use GraphQLList with GraphQLObject Types

将数据从joomla中的单个组件存储在不同组件的多个表中