4

Symfony2 で Doctrine ORM を使用する場合、3 つの異なるエンティティから生成された次のテーブルがあり、そのうちのaccessory2 つの外部キー制約 (以下で A と B とマーク) があります。

describe publication;
+-------------------+--------------+------+-----+---------+----------------+
| Field             | Type         | Null | Key | Default | Extra          |
+-------------------+--------------+------+-----+---------+----------------+
| id                | int(11)      | NO   | PRI | NULL    | auto_increment |
| kid               | varchar(10)  | NO   |     | NULL    |                |
| title             | varchar(255) | NO   |     | NULL    |                |
| title_canonical   | varchar(255) | NO   |     | NULL    |                | <- A
| created           | datetime     | NO   |     | NULL    |                |
| modified          | datetime     | NO   |     | NULL    |                |
+-------------------+--------------+------+-----+---------+----------------+

describe accessory;
+-------------------+--------------+------+-----+---------+----------------+
| Field             | Type         | Null | Key | Default | Extra          |
+-------------------+--------------+------+-----+---------+----------------+
| id                | int(11)      | NO   | PRI | NULL    | auto_increment |
| publication_title | varchar(255) | YES  |     | NULL    |                | <- A
| index_id          | int(11)      | NO   |     | NULL    |                |
| index_alias       | varchar(255) | NO   |     | NULL    |                |
| value             | longtext     | NO   |     | NULL    |                |
| attribute_name    | varchar(255) | YES  |     | NULL    |                | <- B
+-------------------+--------------+------+-----+---------+----------------+

describe attribute;
+-------------------+--------------+------+-----+---------+----------------+
| Field             | Type         | Null | Key | Default | Extra          |
+-------------------+--------------+------+-----+---------+----------------+
| id                | int(11)      | NO   | PRI | NULL    | auto_increment |
| name              | varchar(255) | NO   |     | NULL    |                |
| name_canonical    | varchar(255) | NO   |     | NULL    |                | <- B
| parameter         | varchar(16)  | NO   |     | NULL    |                |
+-------------------+--------------+------+-----+---------+----------------+

外部キーは注釈でマップされます。

Publication.php

/**
 * @ORM\OneToMany(targetEntity="Accessory", mappedBy="publication")
 */
protected $accessories;

アクセサリー.php

/**
 * @ORM\ManyToOne(targetEntity="Publication", inversedBy="accessories")
 * @ORM\JoinColumn(name="publication_title", referencedColumnName="title_canonical")
 */
protected $publication;


/**
 * @ORM\ManyToOne(targetEntity="Attribute", inversedBy="accessories")
 * @ORM\JoinColumn(name="attribute_name", referencedColumnName="name_canonical")
 */
protected $attribute;

属性.php

/**
 * @ORM\OneToMany(targetEntity="Accessory", mappedBy="attribute")
 */
protected $accessories;

しかし、実行するphp app/console doctrine:schema:update --forceと、この例外が発生しました

[Doctrine\DBAL\DBALException]                                                                                                                                               
An exception occurred while executing 'ALTER TABLE accessory ADD CONSTRAINT FK_A1B1251CCEE83EE7 FOREIGN KEY (publication_title) REFERENCES publication (title_canonical)':  

SQLSTATE[HY000]: General error: 1005 Can't create table 'publicationsapp.#sql-2a3c_2828' (errno: 150)

だから私は走ったphp app/console doctrine:schema:update --dump-sql

ALTER TABLE accessory ADD CONSTRAINT FK_A1B1251CCEE83EE7 FOREIGN KEY (publication_title) REFERENCES publication (title_canonical);
ALTER TABLE accessory ADD CONSTRAINT FK_A1B1251C5CBDA8E FOREIGN KEY (attribute_name) REFERENCES attribute (name_canonical);
CREATE INDEX IDX_A1B1251CCEE83EE7 ON accessory (publication_title);
CREATE INDEX IDX_A1B1251C5CBDA8E ON accessory (attribute_name);

これを解決する正しい方法は何ですか? テーブルを手動で編集するか、Doctrine で編集する必要がありますか?

私が errno 150 について読んだことに基づいて、外部列にインデックスを付ける必要がありますが、Doctrine はこれを自動的に処理できませんか?

4

1 に答える 1

4

unique=true$nameCanonical プロパティと $titleCanonical プロパティの両方に追加することも、外部キーによって参照される列に追加することもできます。次に、スキーマ更新コマンドを削除して実行し、テーブルを再作成します。

$titleCanonicalの場合

/**
 * @var string
 *
 * @ORM\Column(name="title_canonical", type="string", length=255, unique=true)
 */
private $titleCanonical;

しかし理想的には、Doctrine では、外部キーは他のテーブルの主キーを参照して有効にする必要があります。

于 2012-12-06T18:06:01.237 に答える