1対多の関係をSample
モデルとCollector
モデルの多対多関係に変換することで、Symfonyアプリケーションのスキーマを変更しました。 Sample
モデルにはcollector_id
の外部キーがありましたが、今では2つの外部キー:sample_id
とcollector_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
を編集し、次のタスクを実行している:
php symfony doc:generate-migrations-diff
php symfony doc:build --all-classes
すべての関与のモデル/フォーム/フィルタを再構築し、2を作成しました移行クラス。
データベースが生産モードに既にあるので、私は1対多の関係(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()
メソッドがありません。ところで、私はまた、キャッシュをクリアします。
ありがとうございます!
dqlをキャッシュするのにapc(または他のバックエンド)を使用していますか? – greg0ire
はい、私はAPCを使用しています。関連することができますか? – elitalon
あなたの教義がそれを使うように設定されていない限りはありません。あなたのWebサーバーを再起動しようとすると、表示されます。 – greg0ire