一对多的Doctrine关系在Symfony2应用程序中不显示多个条目

时间:2014-05-22 17:41:06

标签: php mysql symfony doctrine-orm twig

背景

我正在为跟踪AED(除颤器),维护记录以及负责维护的人员运行Symfony2应用程序。我正处于测试阶段,并且遇到了与Doctrine实现的一对多双向关系的问题。

该项目是对自定义开发框架的先前架构的转换。这意味着我用了

模式

关系结构是一种“自上而下的方法”,其中AED由以下组织:

Municipalities
    one-to-many-> Organizations
        one-to-many-> Locations
            one-to-many-> AEDs
                one-to-many-> Monthly Check Logs
                one-to-many-> Maintenance Records
            one-to-many-> Persons
                one-to-many-> Contact Entries

(这是简化的,但应该为我遇到的问题提供足够的背景。)

问题

我正在显示“用户个人资料”,其中所有关联的联系人条目都列在表格中。问题是当添加新条目时,只有(最新的)条目出现在表格中。其他的仍然存储在数据库中,但由于某种原因被隐藏。

理想的

调试步骤

我将生产数据库克隆到我的暂存环境中并复制了问题。

我尝试将获取模式强制设为EAGER并仍然遇到同样的问题。

我检查了person.contacts的长度,输出的值为1。

我尝试将runnable eager查询直接带入数据库(如下所示),并得到多个条目(大于1)的结果:

SELECT 
  t0.table_id AS table_id1, 
  t0.ref_id AS ref_id2, 
  t0.person_id AS person_id3, 
  t0.contact_type AS contact_type4, 
  t0.contact_place AS contact_place5, 
  t0.contact AS contact6, 
  t0.contact_id AS contact_id7, 
  t0.person_id AS person_id8 
FROM 
  supContact t0 
WHERE 
  t0.person_id = 1490

我不确定如何从这里继续调试。所需的功能当然是显示多个条目。

守则

Controller Snippet

public function showAction($personId = 0, $organizationId = 0)
    {
        $person = $this->getDoctrine()
                        ->getRepository('AEDTracker:Genperson')
                        ->find($personId);

        return $this->render('AEDTracker:Personnel:show.html.twig', array(
            'person' => $person,
            'organizationId' => $organizationId,
        ));
    }

Twig Template Snippet

    {% if person.contacts is empty %}
    <tr><td colspan="100">No entries</td></tr>
    {% else %}
      {% for item in person.contacts %}
        <tr class="contact_edit" module="contact" name="{{ item.contactId }}">
           <td></td>
           <td>{{ item.contactType }}</td>
           <td>{{ item.contactPlace }}</td>
           <td>{{ item.contact }}</td>
           <td><a href="{{ path('personnelEditContact', { 'contactId': item.contactId, 'organizationId': organizationId }) }}">Edit</a></td>
        </tr>
       {% endfor %}
     {% endif %}

Genperson.orm.xml

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
  <entity name="AED\Tracker\Entity\Genperson" table="genPerson">
    <id name="personId" type="integer" column="person_id">
      <generator strategy="IDENTITY"/>
    </id>

    <!-- Skipped unimportant fields -->

    <one-to-many field="contacts" target-entity="Supcontact" mapped-by="person" fetch="EAGER" />
  </entity>
</doctrine-mapping>

Supcontact.orm.xml

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
  <entity name="AED\Tracker\Entity\Supcontact" table="supContact">
    <id name="contactId" type="integer" column="contact_id">
      <generator strategy="IDENTITY"/>
    </id>
    <field name="personId" type="integer" column="person_id" nullable="true" />

    <!-- Removed unimportant fields -->

    <many-to-one field="person" target-entity="Genperson" inversed-by="contacts">
        <join-column name="person_id" referenced-column-name="person_id" />
        <cascade>
            <cascade-persist />
            <cascade-merge />
        </cascade>
    </many-to-one>
  </entity>
</doctrine-mapping>

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

就像一个愚蠢的人,我没有为这个修复尝试一些明显的东西。

Symfony 2.3和2.4之间必定存在错误,因为更新完全解决了这个问题。

对于那些可能偶然发现的人,要进行更新,您必须将新的composer.json文件located here下载到项目的根文件夹中,然后运行

php composer.phar update

将更新所有依赖项,包括Symfony核心和Doctrine库。确保在将其推送到生产环境之前进行测试。

然而,奇怪的是,我必须在我的ORM XML文件中保留fetch="EAGER"参数以保持功能正常运行。这可能不是一个完整的解决方案,其他人可能会有一些进一步的见解。理想情况下,我希望应用程序继续使用延迟加载。