草庐IT

php - 归档一些具有继承性的实体

coder 2023-10-13 原文

我有一个难题要解决,但我不知道该怎么做。

我想归档一些实体,然后从初始表中删除它们。问题是这些实体链接在一起。我有一个接近工作的代码,但我认为这不是一个干净的方法。它由 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。

我会将这些存档用于我应用的另一部分。

表结构示例:

(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, ordre, 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, moyenne, 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, note, nombre, 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 文件,如果您将数据移动步骤也拆分到多个文件中,可能会更容易管理。

关于php - 归档一些具有继承性的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44225676/

有关php - 归档一些具有继承性的实体的更多相关文章

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  3. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

  4. ruby-on-rails - Rails 单表继承 : How to override the value written to the type field - 2

    在我的系统中,我已经定义了STI。Dog继承自Animal,在animals表中有一个type列,其值为"Dog"。现在我想让SpecialDog继承自dog,只是为了在某些特殊情况下稍微修改一下行为。数据还是一样。我需要通过SpecialDog运行的所有查询,以返回数据库中类型为Dog的值。我的问题是因为我有一个type列,rails将WHERE"animals"."type"IN('SpecialDog')附加到我的查询中,所以我不能获取原始的Dog条目。所以我想要的是以某种方式覆盖rails在通过SpecialDog访问数据库时使用的值,使其表现得像Dog。有没有办法覆盖用于类型

  5. ruby - 具有两个参数的 block - 2

    我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋

  6. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  7. ruby - 找一些句子 - 2

    我想找到在某些文本中找到一些(让它是两个)句子的好方法。什么会更好-使用正则表达式或拆分方法?你的想法?应JeremyStein的要求-有一些例子示例:输入:ThefirstthingtodoistocreatetheCommentmodel.We’llcreatethisinthenormalway,butwithonesmalldifference.IfwewerejustcreatingcommentsforanArticlewe’dhaveanintegerfieldcalledarticle_idinthemodeltostoretheforeignkey,butinthis

  8. ruby-on-rails - 具有同名的模块和类 - 2

    我有一个模块stat存在于目录结构中:lib/stat_creator/stat/在lib/stat_creator/stat.rb中,我在lib/stat_creator/stat/目录中有我需要的文件,以及:moduleStatCreatormoduleStatendend当我使用该模块时,我将这些类称为StatCreator::Stat::Foo.new现在我想要一个存在于应用程序中的根Stat类。我在app/models中制作了我的Stat类,并在routes.rb中进行了设置。但是,如果我转到Rails控制台并尝试在应用程序/模型中使用Stat类,例如:Stat.by_use

  9. ruby-on-rails - 在具有 ActiveRecord 条件的相关模型中按字段排序 - 2

    我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我

  10. ruby-on-rails - Sunspot:如何对具有不同值的多个字段进行全文查询? - 2

    我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使

随机推荐