【问题标题】:JMSSerializerBundle, SoftDeleteable, and Many-to-Many's in Doctrine / Symfony2Doctrine / Symfony2 中的 JMSSerializerBundle、SoftDeleteable 和多对多
【发布时间】:2013-11-14 18:49:18
【问题描述】:

我在具有大量交叉引用数据的系统中使用 Gedmo Doctrine Extensions 和 SoftDeleteable 扩展。我遇到了以下情况:

  1. 产品 A 分配给 供应商 B
  2. 供应商 B 被 [软] 删除
  3. 产品 A 现在在序列化时会抛出“实体不存在”,因为“供应商”外键仍然具有 供应商 B 的 ID,即使该实体已被软删除并且可以'不被提取。

需要注意的是我不希望delete级联,也就是说我不想仅仅因为Supplier B被删除了就删除Product A .当供应商记录被删除时,我只需要将供应商外键设置为 NULL(或被 JMS 解释为 NULL)。

这是一种常见的情况,我无法想象其他人没有遇到这种情况,但我找不到任何答案。有人有什么建议吗?

谢谢, -内特

【问题讨论】:

  • 您需要在Product表中手动设置null“供应商”外键。这取决于您如何构建 Product 模型来级联或不级联关系。
  • 那么是否会通过在供应商实体被删除之前触发的事件侦听器手动执行查找并将键重置为 NULL?

标签: php symfony doctrine-orm


【解决方案1】:

对于同样的场景,我是这样做的:

抛出 EntityNotFoundException 的扩展 Doctrine 代理订阅者。要覆盖服务,只需添加参数:

jms_serializer.doctrine_proxy_subscriber.class: YourCustom\JMSDoctrineProxySubscriber

在您的自定义 DoctrineProxySubscriber 上

<?php

namespace YourCustom;

use Doctrine\ORM\EntityNotFoundException;
use JMS\Serializer\EventDispatcher\PreSerializeEvent;
use JMS\Serializer\EventDispatcher\Subscriber\DoctrineProxySubscriber;

class JMSDoctrineProxySubscriber extends DoctrineProxySubscriber
{
    public function onPreSerialize(PreSerializeEvent $event)
    {
        try {
            parent::onPreSerialize($event);
        } catch (EntityNotFoundException $e) {
            // The exception is thrown when soft-deleted objects are tried to be loaded.
            // Soft-deleted Doctrine proxy objects should be treated as null. Overriding event type which is eventually
            // a class name to stdClass would make it skip and result in as null.
            $event->setType('stdClass');
        }
    }
}

【讨论】:

    【解决方案2】:

    试试这个:

    $product = $em->find('models\ProductA', 1);
    $supplier = $product->getSupplier();
    $product->setSupplier(null);
    
    $em->remove($supplier);
    $em->flush();
    

    【讨论】:

      猜你喜欢
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多