Doctrine毫无理由地进行更新

时间:2013-08-28 20:09:24

标签: php doctrine-orm

当我执行我的代码时,Doctrine会将数据库中的值更改为0,尽管我从未更改过该值。这个领域甚至没有Setter-Method。

该字段是ID的一部分。

Doctrine如何改变价值?

修改

该字段属于实体PageNamespaceTranslation,由doctrine修改的字段为language_id

我使用的是XML,而不是注释。

<entity name="exodus\domain\meta\pages\namespaces\PageNamespaceTranslation" table="page_namespace_translation">
    <id name="translated" association-key="true" />
    <id name="language_id" type="integer" column="lang_id" />

    <many-to-one target-entity="PageNamespace" field="translated" inversed-by="translations">
        <join-column name="namespace_id" referenced-column-name="namespace_id" />
    </many-to-one>

更新

我认为我已经对问题进行了本地化:我有一个名为InformationObjectAliasPageTranslation的实体,它也有一个名为language_id的字段。列lang_id使用了两次:对于字段language_id以及作为PageNamespaceTranslation的外键的一部分。

当我进行以下查询时会出现问题:

SELECT p FROM exodus\domain\meta\pages\InformationObjectAliasPageTranslation p
JOIN p.namespace ns
JOIN ns.translated nst
WHERE nst.namespaceId = :ns AND p.language_id = :langId AND p.title = :title

当我在选择中添加nsnst时,问题不会发生。

但是,当我更改映射以使列lang_id仅使用一次时,也没有问题。

InformationObjectAliasPageTranslation在其原始形式中的映射:

<entity name="exodus\domain\meta\pages\InformationObjectAliasPageTranslation" table="page_translation">
    <id name="translated" association-key="true" />
    <id name="language_id" type="integer" column="lang_id" />

    <many-to-one target-entity="InformationObjectAliasPage" field="translated" inversed-by="translations">
        <join-column name="page_id" referenced-column-name="page_id" />
    </many-to-one>

    <many-to-one target-entity="exodus\domain\meta\pages\namespaces\PageNamespaceTranslation" field="namespace">
        <join-columns>
            <join-column name="namespace_id" referenced-column-name="namespace_id" />
            <join-column name="lang_id" referenced-column-name="lang_id" />
        </join-columns>
    </many-to-one>

可以双重使用列lang_id导致这种效果吗?

1 个答案:

答案 0 :(得分:0)

似乎Doctrine不支持共享列。在这种情况下它表现得很奇怪,并且因为重复列而无法插入。

我现在使用冗余的解决方案而不是使用共享列,毕竟它似乎是一个更好的解决方案,因为这些日期通常是读取的,几乎不会改变。