#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...
}