Я наблюдаю неожиданный эффект кеширования в Doctrine (1.2.4).
У меня есть пара связанных таблиц, определенных следующим YAML (несколько дополнительных полей, не используемых в примере, удалены). Просто простая связь 1-Многие от учеников к школам.
School:
tableName: tblschool
columns:
sch_id:
name: sch_id as id
primary: true
autoincrement: true
type: integer(4)
sch_name:
name: sch_name as name
type: string(50)
Student:
tableName: tblstudent
columns:
stu_id:
name: stu_id as id
primary: true
autoincrement: true
type: integer(4)
stu_sch_id:
name: stu_sch_id as school_id
type: integer(4)
relations:
School:
local: school_id
foreign: id
foreignAlias: Students
Я могу создать простой запрос Doctrine (1.2.4), чтобы вернуть ученика с
$result1 = Doctrine_Query::create()
->from('Student s')
->where('s.id = 1')
->execute();
, а затем извлечь соответствующее название школы с помощью
foreach ($result1 as $result) { $ans[] = $result->School["name"]; }
Я сейчас измените school_id (который вызывает взаимосвязь), выполнив это с помощью:
foreach ($result1 as $result)
{ $result["school_id"] = 1 - $result["school_id"]; $result->save(); }
(я настроил БД так, чтобы это давало другой действительный идентификатор школы).
Если бы я должен был сейчас, немедленно, попробуйте получить доступ к взаимосвязи Я получу название старой школы. Я понимаю это - это потому, что я не вызывал refreshRelated (). Что я нахожу неожиданным, так это то, что если я немедленно сделаю другой запрос, дублирующий первый
$result2 = Doctrine_Query::create()
->from('Student s')
->where('s.id = 1')
->execute();
и получу его результат
foreach ($result2 as $result) { $ans[] = $result->School["name"]; }
, когда я исследую содержимое моего массива, я обнаружу, что в обоих случаях , у меня есть то же название школы. Другими словами, хотя я выполнил второй запрос и смотрю на результат запроса, связь не обновляется.
Данные в базе данных в порядке и согласованы; т.е. соответствующие ученики и школы существуют. Например. повторное выполнение указанной выше последовательности - в другой программе - использует другое название школы (хотя и повторяется).
Откуда берется это кеширование?