Можно ли получить данные из нескольких таблиц, используя GraphQLList - PullRequest
0 голосов
/ 12 марта 2019

В 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;
})
}

Могу ли я написать здесь типа: новый GraphQLList (Films,MovieStream) ??

Я пробовал, но это не работает.Пожалуйста, дайте мне некоторое представление, как мне получить поля обеих таблиц ???

1 Ответ

0 голосов
/ 12 марта 2019

В 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 и прочитать о GraphQLInterfaceType и GraphQLUnionType в документации по GraphQL.js.

...