2011-09-13 53 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中所述。