2012-12-06 40 views
4

在Symfony2中使用Doctrine ORM時,我有三個不同的實體生成下表,其中accessory有兩個外鍵約束(下面標記爲A和B)。Doctrine 2模式更新產生MySQL errno 150,外鍵約束

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; 

Accessory.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; 

Attribute.ph p

/** 
* @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

可以將unique=true添加到$ nameCanonical和$ titleCanonical屬性中,或者通過外鍵引用任何列。然後刪除並運行架構更新命令以重新創建表。

在$ titleCanonical的情況下

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

但與理想主義,外鍵應參考其他表的主鍵,使其有效。