Как обновить или создать сущности (с отношениями) через graphql и typeorm - PullRequest
0 голосов
/ 14 октября 2019

Я использую typeorm, type-graphql и postgres, apollo-graphql-express в моем проекте. У меня есть некоторые проблемы с созданием или обновлением сущностей с помощью typeorm. Пример: я сделал запросы и мутации (по объяснению моей задачи), такие как

// Мутация registerRestaurant (имя: строка, адрес: строка, телефон: строка, тип: Int, restaurant_key: String, штаб-квартира: Int): Ресторан

// Обновление мутацийРесторан (restaurantId: Int !, имя: String, адрес: String, телефон: String, тип: Int, restaurant_key: String, штаб-квартира: Int): Restaurant

У сущности Restaurant есть свойство headquarter, которое возвращает сущность Headquarter (для случаев отношений), здесь есть проблема, из-за которой я не могу обновить или создать сущность Restaurant, используя id в качестве аргумента в мутации. (пример: в ресторане с обновлением мутаций мне нужно сменить штаб-квартиру с id = int, но ресторан entiry не позволяет мне сделать это из-за JoinColumn, я думаю)). Я буду очень рад, если вы обратите на это внимание, если на некоторые вопросы по поводу моего кода я отвечу, СПАСИБО!

@ObjectType()
@Entity("restaurants")
export class Restaurant extends BaseEntity {
@Field(() => Int)
@PrimaryGeneratedColumn()
id: number;

@Field()
@Column("text", { default: '' })
name: string;

@Field()
@Column("text", { default: '' })
address: string;

@Field()
@Column("text", { default: '' })
phone: string;

@Field(() => Int)
@Column("int", { default: 0 })
type: number;

@Field()
@Column("text", { default: '' })
restaurant_key: string; 

@OneToOne(() => Headquarter)
@Field(() => Headquarter)
@JoinColumn()
headquarter: Headquarter; 
}



@Resolver()
export class RestaurantResolver {
@Query(() => Restaurant)
async getRestaurant(
@Arg("restaurantId", { nullable: false }) restaurantId: number
) {
    console.log(await Restaurant.findOne(restaurantId, { relations: 
["headquarter"] }));
const restaurant = await Restaurant.findOne(restaurantId, { relations: 
["headquarter"] });
    if (restaurant) {
      return restaurant;
    } else throw new Error("restaurant not found");
  };

@Query(() => [Restaurant])
async getRestaurants() {
  try {
    return await Restaurant.find({ relations: ["headquarter"] });
  } catch (error) {
    console.log(error);
    throw new Error('restaurants not found');
  }
};

@Mutation(() => Restaurant)
async registerRestaurant(
  @Arg("name", { nullable: false }) name: string, // nullable: false means 
  REQUIRED FIELD
  @Arg("address", { nullable: false }) address: string,
  @Arg("phone", { nullable: false }) phone: string,
  @Arg("type", { nullable: false }) type: number,
  @Arg("restaurant_key", { nullable: false }) restaurant_key: string,
  // @Arg("headquarter", { nullable: false }) headquarter: number
) {
    const restaurant = new Restaurant();
    restaurant.name = name || restaurant.name;
    restaurant.address = address || restaurant.address;
    restaurant.phone = phone || restaurant.phone;
    restaurant.type = type || restaurant.type;
    restaurant.restaurant_key = restaurant_key || 
     restaurant.restaurant_key;
    // restaurant.headquarter = headquarter || restaurant.headquarter; 
    //??? how to update when in Restaurant Entity is OnetoOne and 
    JoinColumn

    try {
      return await Restaurant.save(restaurant);
    } catch (error) {
      console.log(error);
      return error.message;
    };   
  };

  @Mutation(() => Restaurant)
  async updateRestaurant(
  @Arg("restaurantId", { nullable: false }) restaurantId: number,
  @Arg("name", { nullable: true }) name?: string,
  @Arg("address", { nullable: true }) address?: string,
  @Arg("phone", { nullable: true }) phone?: string,
  @Arg("type", { nullable: true }) type?: number,
  @Arg("restaurant_key", { nullable: true }) restaurant_key?: string,
  @Arg("headquarter", { nullable: true }) headquarter?: number
  )  {
  console.log("phone",phone);
  const restaurantToUpdate = await Restaurant.findOne(restaurantId);
  console.log(restaurantToUpdate);
  if (restaurantToUpdate) {
    restaurantToUpdate.name = name || restaurantToUpdate.name;
    restaurantToUpdate.address = address || restaurantToUpdate.address;
    restaurantToUpdate.phone = phone || restaurantToUpdate.phone;
    restaurantToUpdate.type = type || restaurantToUpdate.type;
    restaurantToUpdate.restaurant_key = restaurant_key || 
    restaurantToUpdate.restaurant_key;
    restaurantToUpdate.headquarter = headquarter || 
    restaurantToUpdate.headquarter; // type number is not assignable to type 
    Headquarter
    return Restaurant.save(restaurantToUpdate);
  } else {
    throw new Error("restaurant not found");
  };
  }; 
  };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...