Symfony 4 和 Doctrine 2 从集合中删除(第一个)项目后序列化导致转换为 JSON 对象而不是数组

2024-04-28

我在序列化已删除第一个元素的集合时遇到很多麻烦。

我有 CompaniesCollection 实体,与 Company 实体有 Many2Many 关系。

/**
 * @ORM\ManyToMany(targetEntity="App\Entity\Company")
 * @Groups({"get-by-collection-owner"})
 */
private $items;

当我使用该集合获取对象时,我收到的项目是我首先添加的两个元素的数组。我将其序列化

{
    "id": 19,
    "name": "collection dummy name",
    "items": [
        {
            "id": 431,
            "name": "Company 1"
        },
        {
            "id": 435,
            "name": "Company 2"
        }
    ],
    "createdAt": "2019-03-11T13:55:43+01:00",
    "updatedAt": "2019-03-11T15:48:57+01:00"
},

然后我删除第一项:

    $collection->removeItem($companyToRemove);
    $em = $this->getDoctrine()->getManager();
    $em->persist($collection);
    $em->persist($companyToRemove);
    $em->flush();

    $results = $companiesCollectionRepository->getCollections($companyLoader->getCurrentCompany());

序列化 $results 并获取不是一个元素的数组,而是具有前一个项目数组中第二个元素的键的对象:

{
    "id": 19,
    "name": "collection dummy name",
    "items": {
        "1": {
            "id": 435,
            "name": "Company 2"
        }
    },
    "createdAt": "2019-03-11T13:55:43+01:00",
    "updatedAt": "2019-03-11T15:52:48+01:00"
},

当我重新加载页面并获取该对象时,该集合又是一个元素数组,而不是一个对象。显然 Doctrine 不会从数据库获取新结果,而是返回已经加载到内存中的数据。

并且序列化器很可能将此“数组”视为“对象”,因为它的第一个数组元素的键不是以 0 开头,而是以键 1 开头。

有什么方法可以再次进行该查询,以便我获得新生成的密钥,或刷新这些密钥?

EDIT:

实际上我终于找到了简单的解决方案:刷新后刷新

    $collection->removeItem($companyToRemove);
    $em = $this->getDoctrine()->getManager();
    $em->persist($collection);
    $em->persist($companyToRemove);
    $em->flush();
    $em->refresh($collection);

我也遇到过同样的问题。这是另一个似乎对我有用的解决方案。

自定义规范化器,将用于键中带有“漏洞”的集合:

namespace App\Serializer\Normalizer;

use Doctrine\Common\Collections\Collection;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Serializer\SerializerAwareInterface;
use Symfony\Component\Serializer\SerializerAwareTrait;

class DoctrineCollectionNormalizer implements NormalizerInterface, SerializerAwareInterface
{
    use SerializerAwareTrait;

    public function normalize($object, $format = null, array $context = array()): array
    {
        /* @var $object Collection */
        $values = $object->getValues();
        $object->clear();
        foreach ($values as $k => $value) {
            $object->set($k, $value);
        }

        return $this->serializer->normalize($object, $format, $context);
    }

    public function supportsNormalization($data, $format = null): bool
    {
        if ($data instanceof Collection) {
            $keys = $data->getKeys();
            $count = count($keys);
            $lastKey = (int) array_pop($keys);
            return $count && $lastKey !== $count-1;
        }
        return false;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Symfony 4 和 Doctrine 2 从集合中删除(第一个)项目后序列化导致转换为 JSON 对象而不是数组 的相关文章

  • 是否需要使用fetch_object或fetch_array?

    我最近发现我可以打印数据库中的结果而不使用mysqli fetch object功能 例如 假设我们有一个简单的 sql select 语句 可以使用如下所示的语句来执行 conn mysqli connect localhost root
  • 使用Sed查找并替换json字段

    我有一组 json 文件 其中在最后一个键值对之后有需要替换的逗号 RepetitionTime 0 72 TaskName WM Manufacturer Siemens ManufacturerModelName Skyra Magne
  • PHP 强制 Apache 错误

    感谢这个论坛 我了解到 PHP header 函数实际上并不将 header 发送到 Apache 服务器 而只发送到客户端 我想要做的是生成错误 500 并让 Apache 显示其相应的页面 有办法强制吗 提前致谢 还有 Allez le
  • Ruby 守护进程,用于使临时 Ruby 实例的对象保持活动状态

    Ruby 是否提供了一种在不同运行的 Ruby 进程之间共享变量 更重要的是 类对象和我认为对此有用的任何其他数据抽象 的机制 例如 如果我有一个类被实例化 初始化并仔细调整到某种状态 我希望该状态对我全天所有其他独立的 Ruby 和 Ir
  • 将多个平台部署到 Elastic Beanstalk (PHP/Python)

    是否可以将多个平台部署到AWS 我有一个 PHP 应用程序 我还想运行一个小的 python 脚本 我看到 PHP 平台默认安装 Python 但是使用eb deployAWS 没有接听requirements txt并安装依赖项 我已经尝
  • 在另一列中查找重复值时,如何将列数据存储为逗号分隔值? [复制]

    这个问题在这里已经有答案了 如果任何公司的产品都相同 我必须组合或内爆子数组值 预期输出应该类似于 0 gt array company gt 1 6 product gt 5 我的数组是 array 0 gt array company
  • MVC3 DropDownList + JSON + 选定问题

    我的网站 MVC3 JQuery 及其移动版本 MVC3 JQuery mobile 之间有一个非常奇怪的行为 它们分为两个不同的解决方案 我正在使用以下代码根据另一个下拉列表 搜索值 更改下拉列表的内容 搜索值 Razor Html Dr
  • printf() 字符串中的名称 PHP 说明符

    PHP 中有没有一种方法可以像 Python 一样命名我的说明符 我想要这个 PHP 版本 foo array name gt 24 printf name d foo 我在 google 或 php 手册中找不到任何相关内容 好问题 通过
  • PHP 中的循环数组

    我创建了一个由部分和问题组成的数组 如何循环浏览各个部分并显示每个部分的嵌套问题 这是我创建数组的方式 db db open query SELECT FROM assessment selections WHERE assessment
  • Go中如何从json字符串中获取键值

    我想尝试从 Go 中的 JSON 获取键值 但我不确定如何操作 我已经能够使用 simplejson 读取 json 值 但是我无法找到如何获取键值 有人能指出我正确的方向和 或帮助我吗 谢谢你 您可以通过执行以下操作来获取 JSON 结构
  • 如何诊断这些 PHP 代码覆盖分段和 zend_mm_heap 损坏错误

    我一直很高兴在我的 Ubuntu 机器上编码 这是一台拥有大量内存的强大机器 我正在研究 4 个新课程 一边编写和运行单元测试 在某些时候 我注意到 虽然单元测试完成得很好 但代码覆盖率却没有 在消息 正在生成代码覆盖率报告 等 之后 我会
  • 使用 Mail_Mime 发送附件到 GMail,收到“noname”附件

    我有一个非常简单的网站表单 可以包含附件 它使用 gmail 的 smtp 发送到 gmail 地址 一切工作都很好 除了文件以 noname 形式到达 没有文件名或扩展名 如果您下载附件并使用正确的文件名重命名它 则该文件可以正常打开 我
  • 如何向 opencart 管理添加新模块?

    我想在 opencart 管理中将子菜单项 位置 添加到 目录 菜单项 在选择位置时 我想看到我自己的位置管理视图页面 该页面与 opencart 数据库中我自己的位置表相互关联 请让我知道在哪里以及创建什么 mvc 才能在开放购物车中实现
  • 为什么 symfony DOMCrawler 对象无法在依赖的 phpunit 测试之间正确传递?

    我有一个适用于我的 symfony 应用程序的 phpunit 测试套件 在该测试文件中 我在不同的测试之间有一些依赖关系 并在依赖关系之间传递一个 DOMCrawler 对象 这样我就不必每次都导航到它 但是 在采用我所做的方法时 您似乎
  • 如何通过htaccess在codeigniter中隐藏index.php和控制器名称

    我想从我的 codeignier url 网站隐藏 index php 和控制器名称 我也想替换这个术语 seo test product ad test product 我在下面提到了我的 htaccess 文件 请指导我如何解决这个问题
  • 如果在 Woocommerce 中应用了任何优惠券代码,请删除一些支付网关

    我开始从事小型 Woocommerce 项目 我有 3 个支付网关进入这家商店 Paypal 信用卡和直接银行转账 我想要的是 如果使用优惠券代码 我想从可用的支付网关中禁用 或删除 Paypal 和信用卡 并仅保留 直接银行转账 作为可用
  • 使用 dockerfile 在 docker 中安装 mongodb 驱动

    我有一个 mongodb docker 容器 我需要另一个安装了 php 和 apache 的 docker 容器 我想从这个容器运行一个 php 脚本并将一些数据发送到 mongodb 容器以将数据保存在 mongodb 数据库中 所以我
  • method_存在于父类php中

    我正在尝试使用 php 函数 method exists 但我需要检查该方法是否存在于对象的父类中 so class Parent public function myFunction class Child extends Parent
  • 自定义 php 论坛 - 显示新的/未读的帖子

    我自己使用 php 编写了一个自定义论坛脚本 我决定不使用 phpbb 和其他工具 因为我希望我所做的事情具有 100 的灵活性 不过我遇到了一个问题 如何向用户显示帖子是否是新的 未读的 我想到了两种解决方案 1 饼干 2 数据库 我不想
  • 通过API更新Twitter背景

    我在通过 Twitter 的 API 更新背景时遇到了一些问题 target url http www google com logos 11th birthday gif ch curl init curl setopt ch CURLO

随机推荐