在GraphQL中,我们可以在GraphQLList中写入对象类型并获取所有字段。我正在使用协会,它正在联接两个表,但是我无法获取两个表的字段。只需要我在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)??
我已经尝试过,但是不起作用。请给我一些想法,我该如何获取两个表的字段?
答案 0 :(得分:0)
在GraphQL中实现此目标的主要方法有两种:联合和接口。
接口是GraphQL模式中两个或更多对象类型共享某些字段(特性)的地方。例如,您可能对商店中的所有商品都有一个Product
界面,其中每个产品都有一个price
,barcode
和shelfLocation
。然后,您所有的产品,例如Shampoo
,Bread
,LawnChair
,都将实现此接口。
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。