2014-09-23 62 views
1
types: 
      product: 
       mappings: 
        title: { search_analyzer: custom_search_analyzer, index_analyzer: custom_index_analyzer, type: string } 
        status: 
        brand.name: { search_analyzer: custom_search_analyzer, index_analyzer: custom_index_analyzer, type: string } 
        brand: 
         type: "nested" 
         properties: 
          status: ~ 
       persistence: 
        driver: orm 
        model: MyBundle\Entity\Product\Product 
        provider: 
         query_builder_method: customProductQueryBuilderElastica 
        listener: ~ 
        finder: ~ 

這是我對類型產品的映射。 customProductQueryBuilderElastica包含僅填充具有活動狀態並且具有活動相關品牌狀態的產品的代碼。如果我從我的管理員更改產品,它工作完美。自動更改嵌套對象上的ES數據

我想要做的是當我將我的品牌狀態更改爲不活動時,所有相關產品都應從ES中刪除。

對於我已經使用品牌爲嵌套的產品,創造監聽它作爲explained here,現在我能夠自動改變對每一件產品在我的ES品牌地位,但我想,當品牌狀態設置爲消除這些產品無效。 這是如何以更好的方式實現的?

回答

1

經過多次嘗試。我終於實現了我想要的。我在這裏發佈我的代碼並嘗試幫助其他人。

感謝@maercky。我參考了他給出的答案here

這是我的config.yml文件。

types: 
      product: 
       mappings: 
        title: { search_analyzer: custom_search_analyzer, index_analyzer: custom_index_analyzer, type: string } 
        status: 
        brand.name: { search_analyzer: custom_search_analyzer, index_analyzer: custom_index_analyzer, type: string } 
        brand: 
         type: "nested" 
         properties: 
          status: ~ 
       persistence: 
        driver: orm 
        model: XXX\MyBundle\Entity\Product\Product 
        provider: 
         query_builder_method: customProductQueryBuilderElastica 
        listener: ~ 
        finder: ~ 

該代碼會去service.yml

fos_elastica.listener.brand.product: 
    class: 'XXX\MyBundle\Listener\ElasticaBrandListener' 
    arguments: 
     - @fos_elastica.object_persister.search.product 
     - ['postPersist', 'postUpdate', 'postRemove', 'preRemove'] 
     - @fos_elastica.indexable 
    calls: 
     - [ setContainer, [ '@service_container', @fos_elastica.object_persister.search.product ] ] 
    tags: 
     - { name: 'doctrine.event_subscriber' } 

最後,這是我的品牌監聽

<?php 

namespace XXX\MyBundle\Listener; 

use FOS\ElasticaBundle\Doctrine\Listener as BaseListener; 
use Doctrine\Common\EventArgs; 
use Symfony\Component\DependencyInjection\ContainerInterface; 
use XXX\MyBundle\Entity\Supplier\Brand; 
use FOS\ElasticaBundle\Persister\ObjectPersister; 

class ElasticaBrandListener extends BaseListener 
{ 

    /** @var \Symfony\Component\DependencyInjection\ContainerInterface */ 
    private $container; 
    private $objectPersisterProducts; 

    public function setContainer(ContainerInterface $container,ObjectPersister $objectPersisterProduct) { 
     $this->container = $container; 
     $this->objectPersisterProducts = $objectPersisterProduct; 
    } 

    /** 
    * @param Doctrine\Common\EventArgs $eventArgs 
    */ 
    public function postUpdate(EventArgs $eventArgs) 
    { 
     /** @var $brand Brand */ 
     $brand = $eventArgs->getEntity(); 

     if ($brand instanceof Brand) { 
      $this->scheduledForUpdate[] = $brand; 
      foreach ($brand->getProducts() as $product) { 
       $brand_status = $brand->getStatus(); 
       $product_status = $product->getStatus(); 
       if($brand_status == 'active' && $product_status == 'active'){ 
        $this->objectPersisterProducts->replaceOne($product); 
       }else{ 
        $this->objectPersisterProducts->deleteOne($product); 
       } 

      } 
     } 
    } 
} 
?> 

這一切對我的作品很好,所以我對這個貢獻其他。

+0

非常感謝你! – 2015-01-14 22:25:04