【问题标题】:TypeORM Cannot query across one-to-many for property errorTypeORM 无法跨一对多查询属性错误
【发布时间】:2021-11-24 23:12:04
【问题描述】:

我有以下两个实体:

import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from "typeorm";

import { Activity } from "./";

@Entity()
export class Fare {
    @PrimaryGeneratedColumn()
    id: number;

    @Column({unique: false,nullable: false})
    name: string;

    @Column({type: "float",unique: false,nullable: false})
    price: number;
    
    @ManyToOne(() => Activity, activity => activity.fares)
    activity: Activity;

    constructor(data ?: Partial<Fare>) {
        Object.assign(this,data);
    }
}

import { Entity, Column, OneToMany, PrimaryGeneratedColumn } from "typeorm";

import { Fare } from "./";

@Entity()
export class Activity {
    @PrimaryGeneratedColumn()
    id: number;

    @Column({unique: true,nullable: false})
    name: string;

    @Column({unique: false,nullable: true})
    description: string;
    
    @OneToMany(() => Fare, (fare) => fare.activity, {cascade: true})
    fares: Fare[];

    constructor(data ?: Partial<Activity>){
        Object.assign(this,data);
    }
}

我想使用以下正文更新活动:

{"id":10, "name":"dddd", "fares":[{"id":5,"name":"jeune","price":20.0}]}

为此,我实现了以下服务:

import { singleton } from 'tsyringe'
import { getConnection, Timestamp } from 'typeorm';

import { Activity } from '../entities/';
import { ActivityRepository } from '../repositories'

import { Fare } from '../entities'

@singleton()
export class ActivityService {

    constructor(private _activityRepository: ActivityRepository) {
        this._activityRepository = getConnection("lasso").getCustomRepository(ActivityRepository);
    }
            
    public update = async (activity: Activity, id: number) => {
        const updatedActivity = await this._activityRepository
            .createQueryBuilder()
            .update(Activity)
            .set(activity)
            .where("id = :id", { id: id })
            .execute();
        return updatedActivity;
    }
};

运行我的更新请求时,我收到以下错误:

(node:204854) UnhandledPromiseRejectionWarning: Error: Cannot query across one-to-many for property fares

我读过this post,这似乎是相关的,但不幸的是它没有帮助。你知道如何解决这个错误吗?

【问题讨论】:

    标签: typeorm


    【解决方案1】:

    这可以通过使用Repository 类中的save 方法来解决,根据文档 将所有给定的实体保存在数据库中。如果数据库中不存在实体,则插入,否则更新。这为我的服务提供了以下代码:

    import { singleton } from 'tsyringe'
    import { getConnection, Timestamp } from 'typeorm';
    
    import { Activity } from '../entities/';
    import { ActivityRepository } from '../repositories'
    
    import { Fare } from '../entities'
    
    @singleton()
    export class ActivityService {
    
        constructor(private _activityRepository: ActivityRepository) {
            this._activityRepository = getConnection("lasso").getCustomRepository(ActivityRepository);
        }
                
        public update = async (activity: Activity, id: number) => {
            const updatedActivity = await this._activityRepository.save(activity);
            return updatedActivity;
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 2020-10-09
      • 2022-01-15
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      相关资源
      最近更新 更多