首页 文章

PHP Symfony一对多关系结果缓存

提问于
浏览
1

在与Symfony 1.4定义一对多的关系时,我得到了意想不到的行为(对我来说!) . 这是一个演示行为的简单示例,具有Employer表和Employee表:一个雇主可以拥有许多Employees . 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() 时,我得到了这个预期的行为 .

但是,在后续调用中,如果已将其他员工添加到雇主(以编程方式或直接在DB [MySQL]中),则 getWorkers() 调用仍会返回第一个结果 .

我通过逐步调试Symfony来验证 getWorkers() 调用,在后续调用中,它返回存储在 _references 数组中的缓存值 .

如果我以编程方式跟随外键,通过 employee_id 查询 Employee ,那么我得到完整的结果集 .

谁能解释这种行为?

这是我在'action'中运行的一些示例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 回答

  • 2

    添加新的相关记录时,您可能需要刷新记录的关系 .

    您可以执行以下任一操作:

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

    如需更多信息,请查看:Doctrine Documentation - Refreshing Relationships

相关问题