Я получаю неожиданное поведение (для меня!) При определении отношений один-ко-многим с Symfony 1.4.Вот простой пример, который демонстрирует поведение с таблицей Employer и таблицей Employee: у одного Employer может быть много сотрудников.Файл схемы YML выглядит следующим образом:
Employee:
columns:
id: { type: integer, primary: true, autoincrement: true }
first_name: { type: string(30), notnull: true }
last_name: { type: string(30), notnull: true }
employer_id: { type: integer }
relations:
Employer:
local: employer_id
foreign: id
type: one
foreignType: many
foreignAlias: Workers
Employer:
columns:
id: { type: integer, primary: true, autoincrement: true }
name: { type: string(100) }
line1: { type: string(100) }
city: { type: string(100) }
state: { type: string(10) }
Таким образом, вызов getWorkers()
для работодателя должен вернуть сотрудников, связанных с работодателем.Такое ожидаемое поведение возникает при первом вызове getWorkers()
.
Однако при последующих вызовах, если к работодателю добавляются дополнительные сотрудники (программно или напрямую в БД [MySQL]),getWorkers()
вызов по-прежнему возвращает первые результаты.
Я проверил, пройдя по источнику Symfony для вызова getWorkers()
, который при последующих вызовах возвращает кэшированное значение, хранящееся в _references
массив.
Если я программно следую за внешним ключом, запрашивая Employee
по employee_id
, то получаю полный набор результатов.
Может кто-нибудь объяснить такое поведение?
Вот пример кода PHP, который я запускаю в «действии», демонстрирующем поведение:
// Create common employer.
$employer = new Employer();
$employer->setName("My Employer");
$employer->setLine1("100 Main Street");
$employer->setCity("AnyTown");
$employer->setState("State");
$employer->save();
// Create two employees,
$worker1 = new Employee();
$worker1->setFirstName("John");
$worker1->setLastName("Doe");
$worker1->setEmployer($employer);
$worker1->save();
$worker2 = new Employee();
$worker2->setFirstName("Jane");
$worker2->setLastName("Smith");
$worker2->setEmployer($employer);
$worker2->save();
$myEmployer = Doctrine_Core::getTable('Employer')->findOneBy('name', 'My Employer');
$workers = $myEmployer->getWorkers();
echo "Number of workers for " . $myEmployer->getName() . ' is ' . count($workers);
// This gives the expected 2 employees.
// Now create another employee in the common employer.
$worker3 = new Employee();
$worker3->setFirstName("Anne");
$worker3->setLastName("Droid");
$worker3->setEmployer($employer);
$worker3->save();
$myEmployer = Doctrine_Core::getTable('Employer')->findOneBy('name', 'My Employer');
$workers = $myEmployer->getWorkers();
echo "Number of workers for " . $myEmployer->getName() . ' is ' . count($workers);
// This still gives 2 employees, whereas there are 3 in the DB.
// Follow FK directly.
$workers = Doctrine_Core::getTable('Employee')->findBy('employer_id', $myEmployer->getId());
echo "Number of workers for " . $myEmployer->getName() . ' is ' . count($workers);
// This gives the expected 3 employees.
Как заставить его повторять отношение каждый раз?