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查询问题,我们如何保留子查询并继续这样做?因此,它不会在列表视图中遇到很多查询。