【问题标题】:Entity doesn't associate correctly实体未正确关联
【发布时间】:2016-02-23 12:47:21
【问题描述】:

我有下一个关系:

Presupuesto: oneToMany with Revision
Revision: oneToMany with Capitulo
Capitulo: oneToMany with Requisito
Requisito: oneToMany with Articulo

我有一个嵌入了这些实体和“addTagForm”集的表单。问题是,当我提交表单时,除了 RevisionCapitulo 关联为空之外,所有内容都正确关联。

以下是关于这两个实体的最相关信息:

修订.php

/**
 * @ORM\OneToMany(targetEntity="CeiferIT\ComercialBundle\Entity\Capitulo", mappedBy="revision", cascade={"persist"}, orphanRemoval=true)
 */
protected $capitulos;

/**
 * @param \CeiferIT\ComercialBundle\Entity\Capitulo $capitulo
 *
 * @return Revision
 */
public function addCapitulo(\CeiferIT\ComercialBundle\Entity\Capitulo $capitulo)
{
    $capitulo->setRevision($this);
    $this->capitulos[] = $capitulo;

    return $this;
}

/**
 * @param \CeiferIT\ComercialBundle\Entity\Capitulo $capitulo
 */
public function removeCapitulo(\CeiferIT\ComercialBundle\Entity\Capitulo $capitulo)
{
    $this->capitulos->removeElement($capitulo);
}

/**
 * @return \Doctrine\Common\Collections\Collection
 */
public function getCapitulos()
{
    return $this->capitulos;
}

Capitulo.php

/**
 * @ORM\ManyToOne(targetEntity="CeiferIT\ComercialBundle\Entity\Revision", inversedBy="capitulos", cascade={"persist"})
 * @ORM\JoinColumn(name="revision_id", referencedColumnName="id")
 */
private $revision;

/**
 * @param \CeiferIT\ComercialBundle\Entity\Revision $revision
 *
 * @return Capitulo
 */
public function setRevision(\CeiferIT\ComercialBundle\Entity\Revision $revision = null)
{
    $this->revision = $revision;
    return $this;
}

/**
 * @return \CeiferIT\ComercialBundle\Entity\Revision
 */
public function getRevision()
{
    return $this->revision;
}

nuevo.html.twig

{{ form_start(formulario) }}
//some code..
{% include 'ComercialBundle:Presupuesto:listaRevisiones.html.twig' %}
//some code..
{{ form_end(formulario) }}

listaRevisiones.html.twig

{% macro information_prototype(revision) %}
    {% if form_errors(revision.total) %}
        {{ form_widget(revision.total, {'attr': {'class': 'form-control totalrevision error'}}) }}
    {% else %}
        {{ form_widget(revision.total, {'attr': {'class': 'form-control totalrevision'}}) }}
    {% endif %}
    {% include 'ComercialBundle:Presupuesto:listacapitulos.html.twig' %}
{% endmacro %}

<div class="ibox product-box active primerarevision" data-prototype="{{ _self.information_prototype(formulario.revisiones.vars.prototype)|e}}">
{% for revision in formulario.revisiones %}
    {{ _self.information_prototype(revision)}}
{% endfor %}
</div>

我不明白为什么revision_id 为空。有任何想法吗?谢谢

【问题讨论】:

  • 您能否在您的控制器中检查数据是否在表单中实际设置正确。所以这将是一个var_dump(),类似于:$form-&gt;getData()-&gt;getRevisions()-&gt;getCapitulos();。这样我们就可以判断出问题出在表单声明中,还是出在 Doctrine 中。
  • 是的,当我转储($form->getData()) 时,出现 Capitulo,但其修订属性为空

标签: php forms symfony doctrine


【解决方案1】:

您处理不属于该关系的 Revision 对象,因此默认情况下,Doctrine 不会检查和保留它。

在拥有方实体(带有JoinColumn 的实体)上工作很重要。

添加到您的控制器(验证表单后):

$capitulo->setRevision($revision);
$em->flush(); 

在此处阅读更多信息:http://docs.doctrine-project.org/en/latest/reference/unitofwork-associations.html#important-concepts

【讨论】:

  • 我不能改变关系,因为它必须是 Revision OneToMany Capitulos
  • 那你需要手动在控制器里做$capitulo-&gt;setRevision($revision);然后flush。
  • 对,我做到了,它有效,但希望它是自动的,通过 AddTag 其他关系有效,谢谢!
  • 如果你想让它自动运行,那么你需要在表单中拥有辅助对象。您可能也可以通过形式或教义事件来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 2023-04-03
  • 2018-04-19
  • 2021-06-09
  • 1970-01-01
相关资源
最近更新 更多