草庐IT

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

coder 2024-05-02 原文

这个案子有点复杂。我有一个 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 - Symfony - 多对一关系的外部属性的未定义索引的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  3. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  7. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  8. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  9. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  10. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

随机推荐