我在Zend项目中使用Doctrine 2 ORM,并且在某些情况下需要将我的实体序列化为JSON。

ATM我使用Querybuilder并加入我需要的所有表。但是我的序列化程序导致该准则延迟加载每个关联的Entity,这会导致相当大的数据量并引发递归。

现在,我正在寻找一种完全禁用Doctrines延迟加载行为的方法。

我选择数据的方式如下:

$qb= $this->_em->createQueryBuilder()
            ->from("\Project\Entity\Personappointment", 'pa')
            ->select('pa', 't', 'c', 'a', 'aps', 'apt', 'p')
            ->leftjoin('pa.table', 't')
            ->leftjoin('pa.company', 'c')
            ->leftjoin('pa.appointment', 'a')
            ->leftjoin('a.appointmentstatus', 'aps')
            ->leftjoin('a.appointmenttype', 'apt')
            ->leftjoin('a.person','p')

我希望我的结果集仅包含选定的表和关联。

任何帮助将不胜感激。

最佳答案

在最新版本的JMSSerializer中,应该注意的地方是

JMS\Serializer\EventDispatcher\Subscriber\DoctrineProxySubscriber

代替
Serializer\Handler\DoctrineProxyHandler

要覆盖默认的延迟加载行为,应定义自己的事件订阅者。

在您的app/config.yml中添加以下内容:
parameters:
    ...
    jms_serializer.doctrine_proxy_subscriber.class: Your\Bundle\Event\DoctrineProxySubscriber

您可以将类从JMS\Serializer\EventDispatcher\Subscriber\DoctrineProxySubscriber复制到Your\Bundle\Event\DoctrineProxySubscriber并注释掉$ object-> __ load();。线
public function onPreSerialize(PreSerializeEvent $event)
{
    $object = $event->getObject();
    $type = $event->getType();

    // If the set type name is not an actual class, but a faked type for which a custom handler exists, we do not
    // modify it with this subscriber. Also, we forgo autoloading here as an instance of this type is already created,
    // so it must be loaded if its a real class.
    $virtualType = ! class_exists($type['name'], false);

    if ($object instanceof PersistentCollection) {
        if ( ! $virtualType) {
            $event->setType('ArrayCollection');
        }

        return;
    }

    if ( ! $object instanceof Proxy && ! $object instanceof ORMProxy) {
        return;
    }

     //$object->__load(); Just comment this out

    if ( ! $virtualType) {
        $event->setType(get_parent_class($object));
    }
}

关于php - 使用JMS序列化程序时禁用Doctrine 2延迟加载吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11575345/

10-12 01:54