PHP Symfony + связь "один ко многим" + кэширование результата

Я получаю неожиданное поведение (мне!) при определении связи "один ко многим" с Symfony 1.4. Вот простой пример, который демонстрирует поведение, имея таблицу 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() на Работодателе должен возвратить Сотрудников связанный w/Работодатель. Я получаю это ожидаемое поведение когда getWorkers() назван в первый раз.

Однако на последующих вызовах, если дополнительные сотрудники были добавлены к работодателю (или программно или непосредственно в DB [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.

Как я вынуждаю это повторно следовать за отношением каждый раз?

1
задан Litotes 10 June 2010 в 17:16
поделиться

1 ответ

При добавлении новых связанных записей вам может потребоваться обновить связи ваших записей.

Вы можете сделать одно из этих действий:

$worker->refresh(true);
$worker->refreshRelated();
$worker->refreshRelated('Employer');

Для получения дополнительной информации вам следует просмотреть следующее: Doctrine Documentation - Refreshing Relationships

2
ответ дан 2 September 2019 в 23:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: