2017-06-09 10 views
1

サブクエリの値をエンティティの仮想プロパティに入れることはできますか?Doctrineサブクエリの値をエンティティの仮想プロパティに追加する

SELECT o, od, (SELECT count(f.id) FROM AppBundle:Feedback f WHERE f.order = o.id AND f.from = :provider) isFeedbackAdded 
FROM AppBundle:Order o 
LEFT JOIN o.detail od 
WHERE o.provider = :provider 
AND o.created > :date 
ORDER BY o.created DESC 

私は、エンティティの仮想プロパティをオーダーisFeedbackAdded値を追加したいので、それが自動的にそれをシリアル化するとき、それは順序オブジェクトと罰金を示しています。

答えて

1

イベントのサブスクライバを作成し、postSerializeイベントにサブスクライブする方法があります。

jms_serializer.event_subscriberタグ

# app/config/services.yml 
services: 
    app.subscriber.oder_serialization_subscriber: 
     class: AppBundle\Subscriber\OrderSerializationSubscriber 
     tags: 
      - { name: jms_serializer.event_subscriber } 

を使用してサービスを定義し、それがサブクエリの一部であるため、加入者クラス

# AppBundle/Subscriber/OrderSerializationSubscriber.php 
<?php 

namespace AppBundle\Subscriber; 

use JMS\Serializer\EventDispatcher\EventSubscriberInterface; 
use JMS\Serializer\EventDispatcher\ObjectEvent; 
use JMS\Serializer\GenericSerializationVisitor; 
use AppBundle\Entity\Order; 

class OrderSerializationSubscriber implements EventSubscriberInterface { 

    /** 
    * @return array 
    */ 
    public static function getSubscribedEvents() { 
     return array(
      array(
       'event' => 'serializer.post_serialize', 
       'method' => 'postSerialize', 
      ) 
     ); 
    } 

    /** 
    * @param ObjectEvent $event 
    */ 
    public function postSerialize(ObjectEvent $event) { 

     /** @var Order $order */ 
     $order = $event->getObject(); 

     if (! $order instanceof Order) { 
      return; 
     } 

     /** @var GenericSerializationVisitor $visitor */ 
     $visitor = $event->getVisitor(); 

     // fetch feed data from repository or directly on the object if a (bidirectional) relation exists 
     $feedback = $order->hasFeedback(); 

     // set virtual property 
     $visitor->addData('isFeedBackAdded', $feedback); 

    } 
} 
+0

Orderエンティティは、 'isFeedbackAdded'または' hasFeedback'を取得することはありません作成します。配列からオブジェクトにどのように渡すことができるかを詳しく説明できます。次は例ですhttps://gist.github.com/iBasit/f0b9e94575f901514a5a73c8ae1f4b81 – Basit

+0

@Basitメインクエリからサブクエリを削除し、エンティティマネージャ/リポジトリをサブスクライバに挿入し、そこにクエリを投げて追加する値を取得します。 – lordrhodos

+0

それは動作しますが、N + 1のクエリの問題を作成していますが、サブクエリをどのように保持できますか?リストビューでは多くのクエリにヒットしません。 – Basit

関連する問題