手动更新 FOs:Elastica 中的实体集合
Manually update a collection of Entity in FOs:Elastica
我有一个包含基因座实体集合的实体菌株。我使用 Elasticsearch 来索引 Locus 文档(在每个轨迹文档中我指的是一个 Strain 属性)。
我想做这样的事情:当用户编辑 Strain 实体时,它手动重新索引(更新)所有 Locus 文档(因为我需要更新所有 Locus 文档中的 Strain 属性)。
为此,我选择在 Doctrine PostUpdate 事件上使用一个监听器,并检查它是否是一个 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;
}
}
最后我找到了一个解决方案:ObjectPersister (FOS\ElasticaBundle\Persister\ObjectPersister),方法是:->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;
}
}
我有一个包含基因座实体集合的实体菌株。我使用 Elasticsearch 来索引 Locus 文档(在每个轨迹文档中我指的是一个 Strain 属性)。
我想做这样的事情:当用户编辑 Strain 实体时,它手动重新索引(更新)所有 Locus 文档(因为我需要更新所有 Locus 文档中的 Strain 属性)。
为此,我选择在 Doctrine PostUpdate 事件上使用一个监听器,并检查它是否是一个 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;
}
}
最后我找到了一个解决方案:ObjectPersister (FOS\ElasticaBundle\Persister\ObjectPersister),方法是:->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;
}
}