php – 使用继承存档一些实体
我有一个难以解决的问题,我不知道该怎么做.
我想存档一些实体,然后从初始表中删除它们.问题是这些实体是连在一起的.我有一个接近工作的代码,但我认为这不是一个干净的方法.它由SQL查询组成,这些查询将带有ID的行复制到新表中. 我想存档这些实体:Colle,ColleQC,QC,PasserColle,Reponse,ReponseQC,StatistiqueColle,StatistiqueQuestion,RepartitionColle,RepartitionQuestion,Tuteur 我将这些存档用于我的应用程序的另一部分. 表结构示例: (Tuteur和AncienAdherent扩展用户) 这是我存档的代码的一部分,但我认为这不是一个干净的方法: public function archiveTuteurs() { $db = $this->em->getConnection(); $query = "INSERT INTO ancien_adherent (id) SELECT u.id FROM user u WHERE discr = 'tuteur'"; $stmt = $db->prepare($query); $stmt->execute(); $query2 = "UPDATE user SET user.discr = 'ancien' WHERE discr = 'tuteur'"; $stmt = $db->prepare($query2); $stmt->execute(); return true; } public function archiveColles() { $db = $this->em->getConnection(); $query = "INSERT INTO banque_colle (id,typeColle,nom,temps_epreuve,matiere_id,dateCreation,ordre,discr) SELECT colle.id,colle.typeColle,colle.nom,colle.temps_epreuve,colle.matiere_id,colle.dateCreation,colle.ordre,colle.discr FROM colle"; $stmt = $db->prepare($query); $stmt->execute(); $query2 = "INSERT INTO banque_colle_qc (id) SELECT colle_qc.id FROM colle_qc"; $stmt = $db->prepare($query2); $stmt->execute(); return true; } public function archiveQC() { $db = $this->em->getConnection(); $query = "INSERT INTO banque_qc (id,titre,id_colle,qcPere,enonce,donnees,item1,item2,item3,item4,item5,corrige_item1,corrige_item2,corrige_item3,corrige_item4,corrige_item5,item1_vrai,item2_vrai,item3_vrai,item4_vrai,item5_vrai,item1_annule,item2_annule,item3_annule,item4_annule,item5_annule,multiple_choices,inclu) SELECT qc.id,qc.titre,qc.id_colle,qc.ordre,qc.qcPere,qc.enonce,qc.donnees,qc.item1,qc.item2,qc.item3,qc.item4,qc.item5,qc.corrige_item1,qc.corrige_item2,qc.corrige_item3,qc.corrige_item4,qc.corrige_item5,qc.item1_vrai,qc.item2_vrai,qc.item3_vrai,qc.item4_vrai,qc.item5_vrai,qc.item1_annule,qc.item2_annule,qc.item3_annule,qc.item4_annule,qc.item5_annule,qc.multiple_choices,qc.inclu FROM qc ORDER BY qc.qcPere ASC"; $stmt = $db->prepare($query); $stmt->execute(); return true; } public function archivePassages() { $db = $this->em->getConnection(); $query = "INSERT INTO banque_passer_colle (colle_id,dateDebut,note) SELECT passer_colle.colle_id,passer_colle.dateDebut,passer_colle.note FROM passer_colle"; $stmt = $db->prepare($query); $stmt->execute(); return true; } public function archiveReponses() { $db = $this->em->getConnection(); $query = "INSERT INTO banque_reponse (id,discr) SELECT reponse.id,reponse.discr FROM reponse WHERE discr='reponseQC'"; $stmt = $db->prepare($query); $stmt->execute(); $query2 = "INSERT INTO banque_reponse_qc (id,question,A,B,C,D,E,note) SELECT reponse_qc.id,reponse_qc.question,reponse_qc.A,reponse_qc.B,reponse_qc.C,reponse_qc.D,reponse_qc.E,reponse_qc.note FROM reponse_qc"; $stmt = $db->prepare($query2); $stmt->execute(); return true; } public function archiveStats() { $db = $this->em->getConnection(); $query = "INSERT INTO banque_statistiquecolle (id,colle_id,effectif,moyenne,mediane,note100,major,minor) SELECT sc.id,sc.colle_id,sc.effectif,sc.moyenne,sc.mediane,sc.note100,sc.major,sc.minor FROM statistiquecolle_groupe scg LEFT JOIN statistiquecolle sc ON sc.id = scg.statistiquecolle_id WHERE scg.groupe_id = 1 AND sc.id NOT IN (SELECT sc1.id FROM statistiquecolle_groupe scg1 LEFT JOIN statistiquecolle sc1 ON sc1.id = scg1.statistiquecolle_id WHERE scg1.groupe_id != 1)"; $stmt = $db->prepare($query); $stmt->execute(); $query2 = "INSERT INTO banque_statistiquequestion (id,question_id,nbReponseTot,nbReponseA,nbReponseB,nbReponseC,nbReponseD,nbReponseE) SELECT sq.id,sq.question_id,sq.moyenne,sq.nbReponseTot,sq.nbReponseA,sq.nbReponseB,sq.nbReponseC,sq.nbReponseD,sq.nbReponseE FROM statistiquequestion_groupe sqg LEFT JOIN statistiquequestion sq ON sq.id = sqg.statistiquequestion_id WHERE sqg.groupe_id = 1 AND sq.id NOT IN (SELECT sq1.id FROM statistiquequestion_groupe sqg1 LEFT JOIN statistiquequestion sq1 ON sq1.id = sqg1.statistiquequestion_id WHERE sqg1.groupe_id != 1)"; $stmt = $db->prepare($query2); $stmt->execute(); $query3 = "INSERT INTO banque_repartitioncolle (id,statColle_id,note,nombre,percentOfEffectif) SELECT rc.id,rc.statColle_id,rc.note,rc.nombre,rc.percentOfEffectif FROM repartitioncolle rc WHERE rc.statColle_id IN (SELECT bsc.id FROM banque_statistiquecolle bsc)"; $stmt = $db->prepare($query3); $stmt->execute(); $query4 = "INSERT INTO banque_repartitionquestion (id,statQuestion_id,percentOfEffectif) SELECT rq.id,rq.statQuestion_id,rq.note,rq.nombre,rq.percentOfEffectif FROM repartitionquestion rq WHERE rq.statQuestion_id IN (SELECT bsq.id FROM banque_statistiquequestion bsq)"; $stmt = $db->prepare($query4); $stmt->execute(); return true; } 解决方法
我最近一直在进行数据库迁移,并且发现最简单的方法(对我来说)就是在SQL中做所有事情.这有点费力,但它对我的项目没有用
首先删除所有约束 # Table1.field1 ALTER TABLE Table1 DROP FOREIGN KEY FK_Table1_field1; ALTER TABLE Table1 DROP INDEX IDX_Table1_field1; # Table1.field2 ALTER TABLE Table1 DROP FOREIGN KEY FK_Table1_field2; ALTER TABLE Table1 DROP INDEX IDX_Table1_field2; 然后添加所有SQL以将数据移动到新表中. 然后删除所有旧表 DROP TABLE IF EXISTS Table1; DROP TABLE IF EXISTS Table2; 然后重新添加所有约束 ALTER TABLE Table1 ADD INDEX IDX_Table1_field1 (field1 ASC); ALTER TABLE Table1 ADD CONSTRAINT FK_Table1_field1 FOREIGN KEY (field1) REFERENCES OtherTable (xxxx) ON DELETE NO ACTION ON UPDATE NO ACTION; 我在其自己的sql文件中保留了每一步,因此对于此示例,将有4个sql文件,如果将数据移动步骤拆分为多个文件,则可能更容易管理. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |