2011-09-13 4 views
1

1対多の関係をSampleモデルとCollectorモデルの多対多関係に変換することで、Symfonyアプリケーションのスキーマを変更しました。 Sampleモデルにはcollector_idの外部キーがありましたが、今では2つの外部キー:sample_idcollector_idを持つ中間モデル(SampleCollectors)があります。Doctrineは、以前マイグレーションでドロップされた列にアクセスしようとしました

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

すべての関与のモデル/フォーム/フィルタを再構築し、2を作成しました移行クラス。

データベースが生産モードに既にあるので、私は1対多の関係(Samplecollector_id)の外部キーを移動するマイグレーションクラスをチューニングした多対多の中間テーブル(SampleCollectorscollector_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()メソッドがありません。ところで、私はまた、キャッシュをクリアします。

ありがとうございます!

+2

dqlをキャッシュするのにapc(または他のバックエンド)を使用していますか? – greg0ire

+0

はい、私はAPCを使用しています。関連することができますか? – elitalon

+0

あなたの教義がそれを使うように設定されていない限りはありません。あなたのWebサーバーを再起動しようとすると、表示されます。 – greg0ire

答えて

1

私はついにこの問題を発見しました。私はProjectConfigurationクラスでAPCキャッシュシステムを使用するように教義を構成していた:あなたはphp symfony cache:clearを実行する際のSymfony事なく、PHPやウェブサーバものではありませんので、

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

このキャッシュは、クリアされません。

このquestion regarding APC cacheに記載されているように、Webサーバーを再起動するか、apc_clear_cache()を使用することができます。

関連する問題