Почему связанный объект Propel получает вызов ловушки preUpdate? - PullRequest
1 голос
/ 03 ноября 2011

Я заметил странное поведение при перехвате перехвата строки preUpdate в Propel (1.6.1).Рассмотрим следующую схему:

<?xml version="1.0" encoding="UTF-8"?>
<database name="test" defaultIdMethod="native" baseClass="MyBaseObject">
    <table name="test_event">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" />
        <column name="name" type="varchar" size="50" required="true" />
        <column name="description" type="varchar" size="250" />
        <column name="location" type="varchar" size="250" />
        <column name="nearest_city" type="varchar" size="100" />
        <column name="start_time" type="timestamp" />
        <column name="duration_mins" type="integer" />
        <column name="organiser_id" type="integer" required="true" />
        <foreign-key foreignTable="test_organiser">
            <reference local="organiser_id" foreign="id" />
        </foreign-key>
    </table>

    <table name="test_organiser">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" />
        <column name="name" type="varchar" size="50" required="true" />     
        <column name="email" type="varchar" size="100" />
    </table>
</database>

Я заметил, что обновление TestOrganiser приводит к двум вызовам preUpdate для пользовательского класса - один для себя и один для TestEvent.Однако, если первая таблица обновлена, только сам получает вызов preUpdate.Почему это так?

Редактировать: ранее я добавил свой собственный ответ.Однако, если кто-то захочет добавить дополнительные детали, пожалуйста, сделайте - чем больше ясности, тем лучше!Если выполняется обновление до test_organiser, в каком смысле можно сказать, что test_event является обновлением, особенно если оно помечено как неизмененное?

1 Ответ

1 голос
/ 03 ноября 2011

Я набрал большую часть этого вопроса, а потом решил для себя! Я думал, что все равно добавлю q, так как думаю, что это представляет общий интерес.

Сначала я думал, что TestEvent должен получить два вызова - один для себя, а другой для его зависимого объекта. Но сохранение в TestEvent не влияет на TestOrganiser, так как отношение идет от test_event к test_organiser.

Итак, поведение Propel правильное; Поскольку test_organiser зависит от test_event, оба уведомляются, если первый изменен. Это можно представить как неиерархическое родительско-дочернее отношение (у test_event есть внешний ключ, то есть «родительский»).

Мое решение для фильтрации связанных уведомлений строк этого типа (и вообще неизмененных строк) состоит в том, чтобы просто сделать это в пользовательском классе предков строк:

    public function preUpdate(PropelPDO $con = null)
    {
        // Ignore (related) rows with no changes
        if (!$this->isModified())
        {
            return true;
        }

        // Rest of handling code here...
    }
...