-1

Doctrine が 1 対 1 の関係の両側に制約を割り当てないようにする方法はありますか? 定義を一方から他方に移動し、所有側を使用しようとしましたが、それでも両方のテーブルに制約が課されます。親テーブルにのみ制約を持たせたい場合-つまり。親に子が関連付けられていない可能性があります。

たとえば、基本的に次の SQL スキーマが必要です。

CREATE TABLE `parent_table` (
  `child_id` varchar(50) NOT NULL,
  `id` integer UNSIGNED NOT NULL auto_increment,
  PRIMARY KEY (`id`)
);

CREATE TABLE `child_table` (
  `id` integer UNSIGNED NOT NULL auto_increment,
  `child_id` varchar(50) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY (`child_id`),
  CONSTRAINT `parent_table_child_id_FK_child_table_child_id`
    FOREIGN KEY (`child_id`)
    REFERENCES `parent_table` (`child_id`)
);

しかし、私はこのようなものを得ています:

CREATE TABLE `parent_table` (
  `child_id` varchar(50) NOT NULL,
  `id` integer UNSIGNED NOT NULL auto_increment,
  PRIMARY KEY (`id`),
  CONSTRAINT `child_table_child_id_FK_parent_table_child_id`
    FOREIGN KEY (`child_id`)
    REFERENCES `child_table` (`child_id`)
);

CREATE TABLE `child_table` (
  `id` integer UNSIGNED NOT NULL auto_increment,
  `child_id` varchar(50) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY (`child_id`),
  CONSTRAINT `parent_table_child_id_FK_child_table_child_id`
    FOREIGN KEY (`child_id`)
    REFERENCES `parent_table` (`child_id`)
);

制約を手動で削除するか、アクセサーを変更してコレクション内の単一のエンティティを返す/設定することができますが (1 対多を使用)、これを処理する方法が組み込まれているようです。

また、Symfony 1.4.4 (pear installtion ATM) を使用しています - sfDoctrinePlugin の問題であり、必ずしも Doctrine 自体ではない場合に備えて。

4

2 に答える 2

2

sfDoctrinePlugin は反対側の関係を自動的に作成する方法でドクトリン モデル ビルダーを構成します。PHP 5.2 では何もできません。

ReflectionProperty::setAccessible()メソッドが使用可能なPHP 5.3 以降では、によって取得できるインスタンスの保護/非公開プロパティを操作できます。そのため、php のリフレクション API を使用して、メソッドをオーバーライドし、不要なリレーションを手動で削除する必要があります。リレーションを自由に削除できるメソッドが提供されていないため、リフレクション API を使用する必要があります。Doctrine_Relation_Parser$this->getTable()->getRelationParser()BaseSomething::setUp()Doctrine_Relation_Parser

于 2010-04-12T20:07:04.727 に答える