php - Symfony - 多对一关系的外部属性的未定义索引

标签 php symfony doctrine-orm mapping entitymanager

这个案子有点复杂。我有一个 Controller 操作 editCreateFirstFormPart,它处理 Workflow 对象的某些字段并呈现两部分表单的适当第一部分。

如果我使用存储对象的 ID 调用此操作方法的路由,表单将加载所有字段,就像它应该的那样。我将填充表单的数据库对象存储在当前 session 中,以防用户决定取消第二种表单中的编辑:

// Persist all changes of made in the first form part
$manager->persist($workflow);
$manager->flush();

// In case the wolkflow already exists store it in the session
if(!$newWorkflow) $this->get('session')->set($workflowSessionName, $workflowBeforeSubmit);
return $this->redirectToRoute('pec_test_pra_edit_workflow_second_part', array(
    'project'               => $project->getId(),
    'workflow'              => $workflow->getId(),
    'newWorkflow'           => $newWorkflow,

    // Pass the name in the session of the stored workflow to the action method which handles the second form
    'workflowSessionName'   => $workflowSessionName,
));

这就像一个魅力。现在,如果(我检索到)用户通过 cancel 按钮提交第二个表单,我想将存储在数据库中的对象重置为第一个表单部分提交之前的状态。因此,我获取存储在 session 中的对象并希望持久化它:

if($sessionObject instanceof Workflow) {
     $manager = $this->getObjectManager();
     $sessionObject = $session->get($workflowSessionName);
     $manager->persist($sessionObject);
     $manager->flush();
}

这里我得到以下错误:

Notice: Undefined index: 0000000061675b3d0000000022ddb0a6 in vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php (line 2917)
Line 2917: return $this->entityIdentifiers[spl_object_hash($entity)];

UnitOfWork->getEntityIdentifier(object(Fuel))// gets called after prepareUpdateData

BasicEntityPersister->prepareUpdateData(object(MProject))

我的实体 WorkflowProject 类具有单向 manyToOne 关系。 MProject 类扩展了 Project 并具有 Fuel 类的一个 fuel 属性。

所以一个Fuel有很多MProject(oneToMany)和许多MProject 有一个 Fuel (manyToOne)。以下是 .orm.yml 文件的相应部分:

Fuel.orm.yml:

  'ABundle\Entity\Fuel':
      ...
      oneToMany:
        projects:
          targetEntity: 'ABundle\Entity\MProject'
          mappedBy: fuel

Fuel 类中:

class Fuel {

    /**
     * The collection of projects using the fuel.
     *
     * @var \Doctrine\Common\Collections\Collection
     */
     private $projects;

     ...

}

MProject.orm.yml:

'ABundle\Entity\MProject':
    repositoryClass: 'ABundle\Repository\MProjectRepository'
    type:  entity

    manyToOne:
      fuel:
        targetEntity: 'ABundle\Entity\Fuel'
        inversedBy: projects

MProject 类中:

use BBundle\Entity\Project as BaseProject; // Origin of Project in my Entity

class MProject extends BaseProject implements SearchableTypeAlias {

    /**
     * The fuel used by the project.
     *
     * @var Fuel
     */
    protected $fuel;
    
    ...

}

Workflow.orm.yml:

MyBundle\Entity\Workflow:
  ...
  manyToOne:
    project:
      targetEntity: BBundle\Entity\Project
      cascade: [persist]
  ...

Workflow 类中:

use BBundle\Entity\Project;

class Workflow  {

    /**
     * @var Project
     */
    private $project;

    ...

}

我真的不知道我的用例出了什么问题,特别是因为在第一个 Controller 操作方法中调用 persist 存储 $workflow 对象没有问题。

如何解决这个 undefined index 错误?

最佳答案

您的问题是您正在尝试保存实体 detached来自 EntityManagerWorkflowProject 实体被标记为 NEW 并安排插入而不是更新。在探索 session 的 Projectproject->fuel 关联期间,另一个具有非空 id 值的 Fuel 实体被发现。但是它是分离的并且在 EntityManager 中找不到 id 因此引发了异常。

应该在数据库中有相应行但不是由 EntityManager 加载的实体(在您的示例中从 session 中反序列化)应该是 merged进入 EntityManager。您应该合并所有 WorkflowProjectFuel 实例。最简单的方法是为级联合并配置 workflow->projectproject->fuel 关联 cascade: [merge] 并仅合并 session Workflow

$manager = $this->getObjectManager();
$sessionObject = $session->get($workflowSessionName);
$manager->merge($sessionObject);
$manager->flush();

请注意,这会自动将实体字段值替换为从 session 中获取的值。

关于php - Symfony - 多对一关系的外部属性的未定义索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46608640/

相关文章:

php - ZF2 ServiceLocatorAwareInterface getServiceLocator 给我 Zend\Validator\ValidatorPluginManager

php - 将 php 代码添加到 .html 文件

php - 学说实体管理器 flush() 方法如何工作?

php - 我如何在注册期间为用户分配角色? (委托(delegate))(Laravel 5.1)

symfony - 如何在实体的 toString 方法中返回翻译

javascript - 如何将 javascript var 插入 Twig 上的路径?

php - Symfony2 从 Twig 扩展服务访问用户

php - 运行特定模式 :update | doctrine doesn't recognize table chages symfony2

forms - symfony2 表单中的空白字段有些奇怪

php - 错误: You have an error in your SQL syntax; check the manual that corresponds .。第 1 行 '1' 附近使用的语法