2017-10-12 12 views
0

Algolia(名前、スラッグ、説明、カテゴリ、スーパーマーケット、イメージ)によってインデックス付けされるべき6つのプロパティを持つプロダクトエンティティを持っています。AlgoliaはSymfony 2.8で更新する際に関連エンティティをインデックス付けしていません

私は新製品のすべてが正しく動作し、以下に示すように、それはどうあるべきかインデックス化されて作成します。

{ 
    "name": "White Bread", 
    "slug": "white-bread", 
    "description": "This is a description", 
    "image": "logo.png", 
    "supermarkets": [ 
    "Unassigned", 
    "Unassigned" 
    ], 
    "categories": [ 
    "Bread", 
    "Unassigned" 
    ], 
    "objectID": "eyJpZCI6MX0=" 
} 

私が行くと、特にスーパーマーケットやカテゴリのいずれかを編集して保存した場合しかし、彼らはしています保存時にアルゴリアに索引付けされません。しかし、私が名前のような他のプロパティを変更した場合、カテゴリやスーパーマーケットに加えた変更は、藻類インデックスに更新されます。

これは私の製品の中からカテゴリを取得するための私の方法です:スーパーやカテゴリは別から来たので、誰もがこのための修正または任意の提案を持っている場合

/** 
* @Algolia\Attribute(algoliaName="supermarkets") 
*/ 
public function getSupermarkets() 
{ 
    $supermarkets = array(); 

    foreach($this->instances as $instance){ 
     $supermarkets[] = $instance->getSupermarketName(); 
    } 

    return $supermarkets; 
} 

は感謝される、私はそれがかもしれないと思いましたエンティティは索引付けされていませんが、まだ修正を見つけることができませんでした。

おかげ

+0

写真の代わりにポストコードを入力してください。 – mega6382

答えて

5

は、私はあなたがインデックスエンティティに教義のイベントサブスクライバーを利用することになるalgolia/algolia-search-bundleを使用していることを前提としています。

エンティティ自体に直接格納されているエンティティのフィールドを編集すると、doctrineサブスクライバが呼び出され、インデックスが更新されます。

ただし、関連するエンティティを更新すると、メインエンティティのサブスクライバは呼び出されません。メインエンティティのサブスクライバにその処理を行わせる必要があります。これにより、インデックスが更新されます。

カテゴリやスーパーマーケットが更新されるたびに関連するエンティティの更新のためのdoctrineイベントサブスクライバを作成し、カスタムイベントをトリガすることをお勧めします。カスタムイベントハンドラでは、関連する製品を見つけてその上のフィールドを更新します(カウンタを更新しますか?)。これはトリックを行います。

+0

ありがとう、私はこれをやろうとします、これはあなたが話していると思いますか? https://symfony.com/doc/2.8/doctrine/event_listeners_subscribers.html#creating-the-subscriber-class – DBarkz

+0

私は、このドキュメントにこれを設定する方法を追ってきましたが、私が何をすべきかは完全にはわかりません「// ...製品で何かする」という部分を使って、私はこのhttps://pastebin.com/PzJpNVksを持っていますが、エンティティを編集するときにどのようにトリガーするのかは分かりません。 – DBarkz

+0

'Category'エンティティの' postUpdate'イベントを待ち受けるdoctrineサブスクライバを作成する必要はありません。ハンドラでは、独自のカスタムcategory_updatedイベントを送出します。 次のステップは、 "category_updated"イベントをリッスンし、関連する 'Product'エンティティを見つけてその上のいくつかのフィールドを更新する独自のカスタムイベントリスナーを作成することです。これにより、あなたのインデックスを更新する 'Product'エンティティの教義イベントが呼び出されます。同じことがスーパーマーケットにも当てはまります。 このソリューションは、DoctrineイベントとSymfonyカーネルイベントの両方を使用します。 – dmnptr

関連する問題