Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当几个对象必须刷新两次时,最优化的持久/刷新策略是什么?_Php_Optimization_Doctrine Orm_Flush - Fatal编程技术网

Php 当几个对象必须刷新两次时,最优化的持久/刷新策略是什么?

Php 当几个对象必须刷新两次时,最优化的持久/刷新策略是什么?,php,optimization,doctrine-orm,flush,Php,Optimization,Doctrine Orm,Flush,设为一个实体:Article,具有一个属性:title。我们需要通过ORM向数据库中插入一系列标题和翻译的标题 PS:翻译后的标题将由可翻译扩展传播到第二个表中。我们不需要更多地了解这个扩展。我们只需要知道一个对象必须刷新两次或在两个不同的时刻才能正确插入数据库 因此,我们想告诉doctrine在数据库中插入N个标题及其翻译: $this->createAndPersistArticle("1-some title in english", "1-un titre en français

设为一个实体:Article,具有一个属性:title。我们需要通过ORM向数据库中插入一系列标题和翻译的标题

PS:翻译后的标题将由可翻译扩展传播到第二个表中。我们不需要更多地了解这个扩展。我们只需要知道一个对象必须刷新两次或在两个不同的时刻才能正确插入数据库

因此,我们想告诉doctrine在数据库中插入N个标题及其翻译:

$this->createAndPersistArticle("1-some title in english",  "1-un titre en français")
$this->createAndPersistArticle("2-another funny title",    "2-un drôle de titre")
...
$this->createAndPersistArticle("N-last but not least",     "N-le dernier mais pas des moindres")
//$this->getManager()->flush();
使用此功能:

private function createAndPersistArticle($title, $translatedTitle) {
    $anArticle = new Article();
    $anArticle->setTitle($title);
    $this->getManager()->persist($anArticle);
    $this->getManager()->flush();

    $anArticle->setTranslatableLocale('fr');
    $anArticle->setTitle($translatedTitle);
    $this->getManager()->persist($anArticle);
    $this->getManager()->flush(); // flush that can be avoided
}
使用这段代码,我们将持久化2*N次,并刷新2*N次

如果我们删除可以避免的刷新,并取消对函数多次调用后写入的刷新的注释,我们将持续2*N次,刷新N+1次,这是一种改进。这将起作用,因为两个不同的持久化对象不会重叠


我想知道是否有更优化的方法告诉教条该做什么,例如,坚持2*N次,对所有标题一次刷新2次,对所有翻译的标题一次刷新2次。您对此有何想法?

transtable扩展是您编写的还是第三方包?我质疑你的基本工作流程。它是一个处理翻译的第三方软件包。如果你想加深示例以了解它在哪种情况下是有用的,你必须想象一下,doctrine后面的侦听器基本上在这里等待一些数据,TranslateableListener正在等待标题/区域设置,这是一个示例,在该示例中,我们需要在持久化时将同一对象的同一属性标题设置为区域设置的数倍。我天真地尝试克隆管理器,并分别将标题与管理器和translatedTitles与克隆一起持久化,但它表现得好像只有一个经理。