我已經通過將一對多關係轉換爲Sample
模型和Collector
模型之間的多對多關係,更改了Symfony應用程序的模式。該Sample
模型有一個collector_id
外鍵,現在有一箇中間模型(SampleCollectors
)與兩個外鍵:sample_id
和collector_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
像上面並執行以下任務:
php symfony doc:generate-migrations-diff
php symfony doc:build --all-classes
已重建每個參與模型/形式/過濾器並創建了兩個遷移課程。
由於數據庫是已經在生產模式中,我已調諧遷移類來移動一對多的關係(Sample
。collector_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
。順便說一句,我也清除緩存。
謝謝!
您是否使用apc(或任何其他後端)來緩存dql? – greg0ire
是的,我正在使用APC。它可能是相關的嗎? – elitalon
除非你的原則被配置爲使用它。嘗試重新啓動您的Web服務器,你會看到。 – greg0ire