2014-09-23 1 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: ~ 

이 코드는

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' } 

을 service.yml로 이동하고 마지막으로이 브랜드에 대한 내 리스너입니다

<?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

대단히 감사합니다! –