Почему связанный объект Propel получает вызов preUpdate hook?

#php #foreign-keys #propel

#php #внешние ключи #propel

Вопрос:

Я заметил странное поведение при перехвате перехвата строки 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:

Я напечатал большую часть этого вопроса, а затем решил его для себя! Я подумал, что все равно добавлю 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...
    }