Php Symfony-创建新实体而不是更新现有实体

Php Symfony-创建新实体而不是更新现有实体,php,symfony,orm,Php,Symfony,Orm,我的结构如下: 包含指向属性及其值的链接的类别属性: <?php class CategoryProperty { // ... /** * @var Property * * @ORM\ManyToOne(targetEntity="App\Entity\Property") * @ORM\JoinColumn(onDelete="cascade", nullable=false) */ private $property; /** * Набор значений

我的结构如下:

包含指向属性及其值的链接的类别属性:

<?php


class CategoryProperty
{

// ...

/**
 * @var Property
 *
 * @ORM\ManyToOne(targetEntity="App\Entity\Property")
 * @ORM\JoinColumn(onDelete="cascade", nullable=false)
 */
private $property;

/**
 * Набор значений свойства доступных в product builder, null если любое значение.
 *
 * @var PropertyValueEntry
 * @Assert\Valid
 *
 * @ORM\OneToOne(targetEntity="App\Entity\Properties\PropertyValues\PropertyValueEntry",
 * cascade={"persist", "remove"})
 */
private $propertyValue;

// ...

}
总的来说,这似乎与我有一个基于选择创建的动态表单这一事实有关。添加类别属性时,会显示一个下拉列表,其中包含属性类型(整数、字符串、面积、体积等),选择后会显示该属性的新表单。虽然这样做很好,并且添加新属性没有问题,但似乎用于编辑同一属性的代码缺少某些内容,它没有进行更新,而是重新创建了该属性。

可能性#1:直接从实体管理器加载实体 您似乎根本没有检索要修改的现有实体

$entity = $easyadmin['item'];
这不应该使用条令来检索现有实体吗?例如:

if (!($entity = $this->getRepository(CategoryProperty::class)->findOneById($id))) {
    throw $this->createNotFoundException("Category property not found.");
}
半相关:您可能还需要检查是否指定了整数ID,如
$ID=$this->request->query->get('ID')是非常假设的:

if (intval($id = $this->request->query->get('id')) < 1) {
    throw $this->createNotFoundException("Category property not specified.");
}
但是,
PropertyValueEntry
CategoryProperty
没有反向关系

单向一对一是可以的,但它必须有一个
@ORM\JoinColumn
指令,以确保保存外部
属性值项的标识符。否则,编辑表单将没有任何信息来知道它需要编辑的现有
属性值条目
(或衍生工具)。这就是为什么在提交表单时创建了一个新的
PropertyValueEntry
(或派生)实例来重置“properties\u values\u value\u entry”表单字段的原因


您尚未显示实体类
属性的源代码,因此我无法检查您的实体关系中是否存在任何进一步的问题。

感谢所有参与人员,我一直在阅读Symfony文档并遇到表单属性。考虑到我的表单结构整体如下:

Category => CategoryPropertyType => PropertyValueType => [Set, Enum, Integer, Boolean, String, Volume]
对于表单,我决定在PropertyValueType配置选项方法中将其设置为true。正如文档中所解释的,当它被设置为false时,实体将被克隆(在我的例子中是true),从而在最后创建一个新对象


请注意,我仍在学习Symfony,当我更好地了解幕后发生的事情时,我将完善答案。

您尝试调试该问题的方法是什么?加载现有实体的代码在哪里?我已经尝试过了,考虑到同样的问题,但是从实体管理器中通过ID检索它并没有多大改变/总之,问题似乎源于这样一个事实,即新属性\u值\u值\u项被创建并分配了一个新值。啊,是的,我明白为什么,我添加了可能性2,解释了这可能是个问题的原因。
$entity = $easyadmin['item'];
if (!($entity = $this->getRepository(CategoryProperty::class)->findOneById($id))) {
    throw $this->createNotFoundException("Category property not found.");
}
if (intval($id = $this->request->query->get('id')) < 1) {
    throw $this->createNotFoundException("Category property not specified.");
}
/**
 * Набор значений свойства доступных в product builder, null если любое значение.
 *
 * @var PropertyValueEntry
 * @Assert\Valid
 *
 * @ORM\OneToOne(targetEntity="App\Entity\Properties\PropertyValues\PropertyValueEntry", cascade={"persist", "remove"})
 */
private $propertyValue;
Category => CategoryPropertyType => PropertyValueType => [Set, Enum, Integer, Boolean, String, Volume]