2011-09-13 30 views
1

我已经通过将一对多关系转换为Sample模型和Collector模型之间的多对多关系,更改了Symfony应用程序的模式。该Sample模型有一个collector_id外键,现在有一个中间模型(SampleCollectors)与两个外键:sample_idcollector_id主义试图访问以前在迁移中删除的列

Sample: 
    columns: 
    id: { type: integer, primary: true, autoincrement: true } 
    ... 
    collector_id: ... # This column is removed 
    ... 
    relations: 
    ... 
    Collectors: { foreignAlias: Collectors, class: Collector, local: sample_id, foreign: collector_id, refClass: SampleCollectors } 

Collector: 
    columns: 
    id:  { type: integer, primary: true, autoincrement: true } 
    ... 
    relations: 
    Samples: { foreignAlias: Samples, class: Sample, local: collector_id, foreign: sample_id, refClass: SampleCollectors } 


SampleCollectors: 
    columns: 
    sample_id: { type: integer, primary: true } 
    collector_id: { type: integer, primary: true } 
    relations: 
    Sample:  { onDelete: cascade } 

我已编辑schema.yml file像上面并执行以下任务:

  1. php symfony doc:generate-migrations-diff
  2. php symfony doc:build --all-classes

已重建每个参与模型/形式/过滤器并创建了两个迁移课程。

由于数据库是已经在生产模式中,我已调谐迁移类来移动一对多的关系(Samplecollector_id)与多对许多中间表(SampleCollectors的外键。 collector_id):

public function preUp() { 
    $sampleTable = Doctrine_Core::getTable('Sample'); 
    // I do this because collector_id has disappeared after model regeneration. 
    $sampleTable->setColumn('collector_id', 'integer', null, array('type' => 'integer')); 
    $this->samples = $sampleTable->findAll()->toArray(); 
} 

public function up() { 
    // ... 
    $this->removeColumn('sample', 'collector_id'); 

    // ... 
    $this->createTable('sample_collectors', array(...), array(
    'type' => 'INNODB', 
    'primary' => array(0 => 'sample_id', 1 => 'collector_id'), 
    ...)); 
} 

public function postUp() { 
    foreach ($this->samples as $sample) { 
    $sampleCollector = new SampleCollectors(); 
    $sampleCollector->setSampleId($sample['id']); 
    $sampleCollector->setCollectorId($sample['collector_id']); 
    $sampleCollector->trySave(); 
    } 
} 

我已经迁移了数据库,一切都很顺利。

但是,现在我正在更新控制器,视图等,Doctrine仍尝试从Sample中检索collector_id列,而不是通过多对多关系进行导航。

由于Sample模型不再存储对它的引用,为什么Doctrine坚持这一点?我检查了BaseSample类,并且它没有hasColumn()方法设置列collector_id。顺便说一句,我也清除缓存。

谢谢!

+2

您是否使用apc(或任何其他后端)来缓存dql? – greg0ire

+0

是的,我正在使用APC。它可能是相关的吗? – elitalon

+0

除非你的原则被配置为使用它。尝试重新启动您的Web服务器,你会看到。 – greg0ire

回答

1

我终于找到了问题。我已经配置主义使用APC缓存系统ProjectConfiguration类:当您执行php symfony cache:clear因为不是Symfony的东西,而是一个PHP和Web服务器的事情

public function configureDoctrine(Doctrine_Manager $manager) { 
    $manager->setAttribute(Doctrine::ATTR_QUERY_CACHE, new Doctrine_Cache_Apc()); 
} 

此缓存不被清除。

您可以重新启动Web服务器或使用apc_clear_cache(),如question regarding APC cache中所述。