Mysql 向实体虚拟财产添加子查询值

Mysql 向实体虚拟财产添加子查询值,mysql,symfony,doctrine-orm,dql,jmsserializerbundle,Mysql,Symfony,Doctrine Orm,Dql,Jmsserializerbundle,是否可以将子查询值放入实体虚拟属性 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

是否可以将子查询值放入实体虚拟属性

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
值添加到Order实体虚拟属性中,因此当它自动序列化它时,Order对象显示良好。

一种方法是创建事件订阅者并订阅
后序列化
事件

使用
jms\u序列化程序.event\u订户
标记定义您的服务

# 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 );

    }
}
#AppBundle/Subscriber/OrderSerializationSubscriber.php

订单实体从未获得
isFeedbackAdded
hasfedback
,因为这是子查询的一部分。您可以详细说明我如何从数组传递到我猜的对象。下面的示例是@Basit从主查询中删除子查询,将实体管理器/存储库注入订阅服务器,并在订阅服务器中启动查询以获取需要添加的值。它确实有效,但它会产生N+1查询问题,我们如何保留子查询并继续这样做?因此,它不会在列表视图中遇到很多查询。