我正在为跟踪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
我不确定如何从这里继续调试。所需的功能当然是显示多个条目。
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,
));
}
{% 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 %}
<?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>
<?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>
非常感谢任何帮助。
答案 0 :(得分:1)
就像一个愚蠢的人,我没有为这个修复尝试一些明显的东西。
Symfony 2.3和2.4之间必定存在错误,因为更新完全解决了这个问题。
对于那些可能偶然发现的人,要进行更新,您必须将新的composer.json
文件located here下载到项目的根文件夹中,然后运行
php composer.phar update
将更新所有依赖项,包括Symfony核心和Doctrine库。确保在将其推送到生产环境之前进行测试。
然而,奇怪的是,我必须在我的ORM XML文件中保留fetch="EAGER"
参数以保持功能正常运行。这可能不是一个完整的解决方案,其他人可能会有一些进一步的见解。理想情况下,我希望应用程序继续使用延迟加载。