手动更新FO中的实体集合:Elastica

时间:2017-05-17 09:44:36

标签: symfony foselasticabundle

我是一个拥有Locus Entities集合的Entity菌株。我使用Elasticsearch来索引Locus文档(在每个locus文档中我引用了一个Strain属性)。

我想做类似的事情:当用户编辑Strain实体时,它会手动重新索引(更新)所有Locus文档(因为我需要更新所有Locus文档中的Strain属性)。

为此,我选择在Doctrine PostUpdate事件中使用Listener,并检查它是否为Strain对象。但我不知道如何要求弹性搜索重新索引我的对象。 有人知道怎么做吗?

<?php

namespace AppBundle\EventListener;

use AppBundle\Entity\Strain;
use Doctrine\ORM\Event\LifecycleEventArgs;

class StrainListener
{
    public function postUpdate(LifecycleEventArgs $args)
    {
        $em = $args->getEntityManager();
        $strain = $args->getEntity();

        if (!$strain instanceof Strain) {
            return;
        }

        $locusList = $em->getRepository('AppBundle:Locus')->findLocusFromStrain($strain);

        // A command that ask to Elasticsearch reindex Locus

        return;
    }
}

1 个答案:

答案 0 :(得分:1)

最后我找到了一个解决方案:ObjectPersister(FOS \ ElasticaBundle \ Persister \ ObjectPersister),方法有: - &gt; replaceMany(array);

<?php

namespace AppBundle\EventListener;

use AppBundle\Entity\Strain;
use Doctrine\ORM\Event\LifecycleEventArgs;
use FOS\ElasticaBundle\Persister\ObjectPersister;

class StrainListener
{
    private $objectPersister;

    public function __construct(ObjectPersister $objectPersister) {
        $this->objectPersister = $objectPersister;
    }

    public function postUpdate(LifecycleEventArgs $args)
    {
        $strain = $args->getEntity();

        if (!$strain instanceof Strain) {
            return;
        }

        $em = $args->getEntityManager();
        $locusList = $em->getRepository('AppBundle:Locus')->findLocusFromStrain($strain);

        $this->objectPersister->replaceMany($locusList);

        return;
    }
}