मेरे पास Channel और User के बीच अनेक से अनेक संबंध हैं, जिसका उपयोग चैनल की सदस्यता लेने वाले उपयोगकर्ताओं को ईमेल सूचनाएं भेजने के लिए किया जाता है। मैं एक ऐसी सुविधा विकसित कर रहा हूं जहां एक चैनल दूसरे के पक्ष में भंग कर दिया गया है, लेकिन मुझे नहीं पता कि सभी सूचनाओं को भंग करने वाले चैनल से लक्ष्य चैनल में कैसे स्थानांतरित किया जाए।


@Entity()
export class User {
    @PrimaryColumn()
    id: string

    @Column()
    createdAt: Date

    @Column()
    updatedAt: Date

    @Column()
    email: string

    @ManyToMany(_type => Channel)
    @JoinTable()
    notifications: Channel[]
}

@Entity()
export class Channel {
    @PrimaryColumn()
    id: string

    @Column()
    createdAt: Date

    @Column()
    updatedAt: Date
}

async function transferNotifications(from: unknown, to: unknown): Promise<void> {
    //?
}
1
David Bell 16 जिंदा 2020, 01:00

1 उत्तर

सबसे बढ़िया उत्तर

आपके पास कम से कम दो विकल्प हैं:

<मजबूत>1. EntityManager के साथ कार्य करना

सबसे पहले, सभी User निकायों को notification से हल किए गए संबंध के साथ लाएं। फिर सभी प्राप्त User संस्थाओं की notification संपत्ति से पुरानी (विघटित) Channel इकाई को हटा दें और उस सरणी में नई Channel इकाई जोड़ें यदि उसमें पहले पुरानी एक शामिल है . यह संबंधित जॉइन टेबल पंक्ति को हटा देगा और नए चैनल में एक नया जोड़ देगा।

स्पष्ट रूप से दोष यह है कि सभी पंक्तियों पर तीन तालिकाओं पर एक जुड़ाव निष्पादित किया जाएगा, जिसमें सभी परिणाम एप्लिकेशन मेमोरी में लोड हो जाएंगे। तो जरूरी नहीं कि बड़ी टेबल के लिए एक अच्छा समाधान हो।

<मजबूत>2. QueryBuilder के साथ कार्य करना

एक बेहतर तरीका यह होगा कि कस्टम जॉइन टेबल एंटिटी को जोड़कर जॉइन टेबल को खुद बनाया जाए। फिर QueryBuilder का उपयोग करके पुराने चैनल की विदेशी कुंजी को नए चैनल की आईडी से बदलें।

getRepository(UserChannel).createQueryBuilder()
   .update()
   .set({ channelId: '<new channel id>' })
   .where(`channelId = :channelId`, { channelId: `<old channel id>`})
   .execute();
@Entity()
export class User {

    @PrimaryColumn()
    id: string

    @Column()
    createdAt: Date

    @Column()
    updatedAt: Date

    @Column()
    email: string

    @OneToMany(type => UserChannel)
    userChannels: UserChannel[]
}

@Entity()
export class UserChannel {

    @ManyToOne(type => User)
    user!: User;

    @Column({ primary: true })
    userId!: string;


    @ManyToOne(type => Channel)
    channel!: channel;

    @Column({ primary: true })
    channelId!: string;
}


@Entity()
export class Channel {

    @PrimaryColumn()
    id: string

    @Column()
    createdAt: Date

    @Column()
    updatedAt: Date
}

3
iY1NQ 16 जिंदा 2020, 16:16