Un pachet de extensii pentru gestionarea relatiilor polimorfe, declaratii si interogari de depozit pentru tiporm

Pachet experimental

Instalare

$ fire adauga typeorm-polimorf

De asemenea, veti avea nevoie de typeorm si reflect-metadate daca nu le-ati instalat deja

Acesta este un concept pe care l-am pus impreuna pentru valori polimorfe decorate cu tiporm. M-am inspirat mult din elocventul lui laravel.

Acest lucru a functionat pentru cazul meu de utilizare, dar s-ar putea sa nu functioneze si pentru altii. Acesta este un exemplu al modului in care l-am folosit.

Extindeti depozitul PolymorphicRepository

Clasa de export @EntityRepository (AdvertEntity) AdvertRepository extinde AbstractPolymorphicRepository <AdvertEntity> {}

Decoratorii de mai jos vor functiona numai atunci cand se utilizeaza depozitul abstract de mai sus AbstractPolymorphicRepository

Configurati entitatile

Acesta este un exemplu de copil, 2 tipuri de parinti

Parinti

@Entity („utilizatori”) clasa de export UserEntity {@PrimaryGeneratedColumn () id: numar; @PolymorphicChildren (() => AdvertEntity, {eager: false,}) reclame: AdvertEntity []; }
Clasa de export Entity („comercianti”) MerchantEntity {@PrimaryGeneratedColumn () id: number; @PolymorphicChildren (() => AdvertEntity, {eager: false,}) reclame: AdvertEntity []; }

Copii

@Entity („anunturi”) clasa de export AdvertEntity implementeaza PolymorphicChildInterface {@PolymorphicParent (() => [UserEntity, MerchantEntity]) proprietar: UserEntity | MerchantEntity; @Column () entityId: number; @Column () entityType: sir; }

Valorile rezultate

Acest lucru va avea ca rezultat ca tabelul cu anunturi sa aiba valori

tabelul cu reclame =========================== id | entityId | entityType =========================== 1 | 1 | „UserEntity” 2 | 1 | „MerchantEntity” 3 | 2 | „UserEntity”

Decoratori

Atat PolymorphicChildren, cat si PolymophicParent sunt tratati la fel. In prezent, unele dintre valorile implicite sunt diferite, dar in cele din urma aceste metode ar trebui sa fie sinonime reciproce. Au nume diferite, deoarece m-au ajutat sa descriu directiile relatiei care ar putea fi explicate ca „copil” „parinte” in moduri diferite.

Directie ambigua

Atat PolymorphicParent, cat si PolymorphicChildren accepta fie o serie de tipuri, fie un tip singular

@PolymorphicChildren (() => [ChildEntity, AnotherChildEntity]) @PolymorphicParent (() => [ParentEntity, AnotherParentEntity]) @PolymorphicChildren (() => ChildEntity) @PolymorphicParentE () =>

Optiuni

cheie pentru ce este? implicit relatii de incarcare dornice in mod implicit adevarat in cascada salvare / stergere parinte / copii la salvare / stergere adevarat stergere Inainte Actualizare stergere relatie / relatii inainte de actualizare falsa Multe ar trebui sa revina ca matrice? adevarat pentru copil. fals pentru parinte

Multe ar trebui sa fie actualizate intr-adevar, astfel incat atat declaratia parinte, cat si cea a copilului sa fie la fel. Am facut pentru a evita, speram, confuzia cu numele!

Metode de depozitare

Majoritatea acestor metode suprascriu metodele clasei Repository tipormorm pentru a se asigura ca relatiile polimorfe sunt tratate inainte / dupa metoda parintelui.

Salvati

Salveaza entitatea data si parintele sau copiii

extinde metoda Repository.save a typeorm

Copil
const repository = connection.getRepository (AdvertRepository); // Care extinde AbstractPolymorphicRepository const advert = new AdvertEntity (); advert.owner = utilizator; asteapta repository.save (reclama);
Mama
const repository = connection.getRepository (MerchantRepository); // Care extinde AbstractPolymorphicRepository const advert = new AdvertEntity (); const parent = new MerchantEntity (); merchant.adverts = [reclama]; asteptati repository.save (comerciant);

gasi

extinde metoda Repository.

penes erectos folladas dormidas
videos de sexo gratis monjas lesvianas
porno vitange xxxxporno
coñitos mamada a dos bocas
xxxjovenes maduras españolas sexo
porno español de maduras porno español incestos
gay se la chupa a hetero zoofilia con cabras
porno casadas españolas lesbianas reales
escuchar relatos porno xxx incesto real
trio casero español incesto subtitulado en español
descargar peliculas porno completas porno retro maduras
mamadas gay incesto xxx
porno torrent magnet jovencita masturbandose
peliculas porno travestis videos culos
mi mujer me folla el culo chicos guapos desnudos
hombres masturbando a mujeres madre follada a la fuerza
orgias xxx pepe porno
orgias caseras compilacion anal
negros follando maduras videos incesto online
abuelas españolas follando negros follando maduras

find a typeorm

const repository = connection.getRepository (MerchantRepository); // Care extinde AbstractPolymorphicRepository const results = await repository.find (); // rezultate [0] .adverts === AdvertEntity []

gaseste una

extinde metoda Repository.findOne de typeorm

crea

Aceasta metoda creeaza relatiile parinte sau copil, astfel incat nu trebuie sa furnizati manual o serie de clase.

extinde metoda Repository.create de tiporm

Copil
const repository = connection.getRepository (AdvertRepository); // Care extinde AbstractPolymorphicRepository const results = await repository.create ({proprietar: new UserEntity, // sau MerchantEntity});
Mama
const repository = connection.getRepository (UserRepository); // Care extinde AbstractPolymorphicRepository const results = await repository.create ({adverts: [{name: ‘test’,}, {name: ‘test’,},],}); / ** * {* anunturi: [* AdvertEntity {* nume: ‘test’, *}, * AdvertEntity {* nume: ‘test’, *}, *], *} * /

hidratMulte

Hidreaza o entitate si obtine relatiile lor cu parintele / copilul

const repository = connection.getRepository (AdvertRepository); // Care extinde AbstractPolymorphicRepository const adverts = await repository.find (); // dornic de parinte (utilizator | comerciant) este setat la reclame false [0] .proprietar; // nedefinit asteapta repository.hydrateMany (anunturi); reclame [0] .proprietar; // UserEntity | MerchantEntity

hydrateOne

Hidreaza o entitate si obtine relatiile lor cu parintele / copilul

const repository = connection.getRepository (AdvertRepository); // Care extinde AbstractPolymorphicRepository const advert = await repository.findOne (1); // dornic de parinte (utilizator | comerciant) este setat la false advert.owner; // nedefinit asteapta repository.hydrateOne (reclama); advert.owner; // UserEntity | MerchantEntity

Transformator de clasa

Va recomandam, daca lucrati cu relatii polimorfe, sa utilizati decoratorul de transformatoare de clasa pentru a distinge diferitele tipuri de pe frontend cand va intoarceti entitatile dintr-un apel http

@Entity („anunturi”) clasa de export AdvertEntity implementeaza PolymorphicChildInterface {@PolymorphicParent (() => [UserEntity, MerchantEntity]) @Transform ((valoare: UserEntity | MerchantEntity) => ({… valoare, tip: value.constructor .name,}), {toPlainOnly: true,},) proprietar: UserEntity | MerchantEntity; @Column () entityId: number; @Column () entityType: sir; }

Proprietatea de tip a obiectului proprietatii proprietarului va fi acum valoarea sirului UserEntity sau MerchantEntity

Relatii posibile

Parinte unic, copii diferiti

Acesta este un exemplu de a avea nevoie de diferite tipuri de copii pentru un tip de parinte singular

clasa RestaurantEntity {@PolymorphicChildren (() => [WaiterEntity, ChefEntity]) personal: (WaiterEntity | ChefEntity) []; } clasa WaiterEntity implementeaza PolymorphicChildInterface {@Column () entityId: string; @Column () entityType: sir; @PolymorphicParent (() => RestaurantEntity) restaurant: RestaurantEntity; } clasa ChefEntity implementeaza PolymorphicChildInterface {@Column () entityId: string; @Column () entityType: sir; @PolymorphicParent (() => RestaurantEntity) restaurant: RestaurantEntity; }

Copil unic, parinte diferit

Acesta este un exemplu de a avea nevoie de un copil singular impartasit intre diferite tipuri de parinti

clasa AdvertEntity implementeaza PolymorphicChildInterface {@PolymorphicParent (() => [UserEntity, MerchantEntity]) proprietar: UserEntity | MerchantEntity; } clasa MerchantEntity {@PolymorphicChildren (() => AdvertEntity) anunturi: AdvertEntity []; } clasa UserEntity {@PolymorphicChildren (() => AdvertisEntity) anunturi: AdvertEntity []; }

Note

Cred ca Perf ar putea avea cateva sugestii despre cum sa imbunatatim lucrurile (imi pare rau ca am raspuns ca sunt mega ocupat!)

Nestjs

Daca utilizati nestjs, nu uitati sa includeti depozitul in matricea de entitati din forFeature

@Module ({importuri: [TypeOrmModule.forFeature ([AdvertEntity, AdvertRepository,]),], furnizori: [AdvertService, CategoryService, TagService, AdvertPolicy], exporturi: [TypeOrmModule, AdvertService],}) clasa de export AdvertModule {}