gpt4 book ai didi

php - 使用 JMS Serializer 时禁用 Doctrine 2 延迟加载?

转载 作者:IT王子 更新时间:2023-10-29 00:21:51 24 4
gpt4 key购买 nike

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

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

现在我正在寻找一种方法来完全禁用 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 Serializer 时禁用 Doctrine 2 延迟加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11575345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com