背景
我正在为一个客户运行Symfony2应用程序,该应用程序跟踪AED(除颤器(、其维护记录以及负责维护的人员。我正在进行测试版发布,遇到了一个与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
(这是简化的,但应该给你足够的上下文来解决我遇到的问题。(
问题
我显示了一个"用户配置文件",其中所有相关的联系人条目都列在一个表中。问题是,当添加一个新条目时,表中只显示(最新的(条目。其他的仍然存储在数据库中,但由于某些原因而被隐藏。
所需
调试步骤
我将生产数据库克隆到我的暂存环境中,并复制了这个问题。
我尝试将fetch模式强制为EAGER
,但仍然存在同样的问题。
我检查了person.contacts
的长度,它输出的值为1。
我尝试将可运行的热切查询直接放入数据库(如下所示(,结果是有多个条目(大于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
我不知道如何从这里开始调试。当然,所需的功能是显示多个条目。
守则
控制器代码段
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模板代码段
{% 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.org.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.org.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>
如有任何帮助,我们将不胜感激。
就像一个愚蠢的人,我没有尝试一些明显的修复方法。
Symfony 2.3和2.4之间一定有一个错误,因为更新完全解决了这个问题。
对于那些可能偶然发现这一点的人,要进行更新,必须将位于此处的新composer.json
文件下载到项目的根文件夹中,然后运行
php composer.phar update
所有依赖项都将更新,包括Symfony核心和条令库。确保在将其推向生产环境之前进行了测试。
然而,奇怪的是,我不得不在ORMXML文件中保留fetch="EAGER"
参数以保持功能正常工作。这可能不是一个完整的解决方案,其他人可能会有一些进一步的见解。理想情况下,我希望应用程序继续使用延迟加载。