微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 使用继承存档一些实体

我有一个难以解决的问题,我不知道该怎么做.

我想存档一些实体,然后从初始表中删除它们.问题是这些实体是连在一起的.我有一个接近工作的代码,但我认为这不是一个干净的方法.它由SQL查询组成,这些查询将带有ID的行复制到新表中.
一个问题是我不需要存档某些字段,因此存档实体与初始实体不完全相同.
我使用原始SQL查询而不是DQL,因为我的表的大小.

我想存档这些实体:Colle,ColleQC,QC,PasserColle,Reponse,ReponseQC,StatistiqueColle,StatistiqueQuestion,RepartitionColle,RepartitionQuestion,Tuteur

BanqueColle,BanqueColleQC,BanqueQC,BanquePasserColle,BanqueReponse,BanqueReponseQC,BanqueStatistiqueColle,BanqueStatistiqueQuestion,BanqueRepartitionColle,BanqueRepartitionQuestion,AncienAdherent.

我将这些存档用于我的应用程序的另一部分.

表结构示例:

enter image description here

(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文件,如果将数据移动步骤拆分为多个文件,则可能更容易管理.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐