Symfony2 OneToMany双向引用不是id列


Symfony2 OneToMany bidirectional referencing not id column

我依赖于一个外部api来填充我的表,有了这种关系,我可以用更少的查询来处理应用程序上一些必需的功能。

使用该命令后,会创建表和FK,而不是错误和警告,但我不知道是否可以绕过这些错误,否则将来会产生问题。

显然,我可以只引用id,问题就会消失,但如果可能的话,现在需要这样做。

我有两个表:

RARITIES
id
name
...
ITEMS
id
item_rarity
...

实体看起来像:

class Rarity
{
    ...
    /**
     * @ORM'OneToMany(targetEntity="Item", mappedBy="rarity")
     */
    private $items;
    public function __construct() {
        $this->items = new ArrayCollection();
    }
    ...
}
class Item
{
    ...
    /**
     * @ORM'ManyToOne(targetEntity="Rarity", inversedBy="items")
     * @ORM'JoinColumn(name="item_rarity", referencedColumnName="name")
     **/
     private $rarity;
    ...
}

当我创建或更新模式时,它输出一些错误和警告:

[Doctrine'ORM'Tools'ToolsException]                                                                                                                                              
Schema-Tool failed with Error 'An exception occurred while executing 'ALTER TABLE items    ADD CONSTRAINT FK_E11EE94D3139CB89 FOREIGN KEY (item_rarity) REFERENCES rarities (name)':                                                                                                                                                                               
SQLSTATE[HY000]: General error: 1005 Can't create table 'd2a.#sql-4fa_7c' (errno: 150)' while executing DDL: ALTER TABLE items ADD CONSTRAINT FK_E11EE94D3139CB89 FOREIGN KEY (item_rarity) REFERENCES rarities (name)                                                                                                                                                                                                                                                                                 

[Doctrine'DBAL'DBALException]                                                                                                                       
An exception occurred while executing 'ALTER TABLE items ADD CONSTRAINT  K_E11EE94D3139CB89 FOREIGN KEY (item_rarity) REFERENCES rarities (name)':  
SQLSTATE[HY000]: General error: 1005 Can't create table 'd2a.#sql-4fa_7c' (errno: 150)                                                              
[PDOException]                                                                          
SQLSTATE[HY000]: General error: 1005 Can't create table 'd2a.#sql-4fa_7c' (errno: 150

谢谢你的建议!

我怀疑这与试图通过'name'链接两者有关,Doctrine不认为这是唯一标识符。就教义而言,可能有两个名字相同的稀罕。'id'起作用的原因是因为它在使用@Id的注释中被声明为主键,因此假设它是唯一的:

/**
 * @ORM'Column(type="integer")
 * @ORM'Id
 * @ORM'GeneratedValue(strategy="AUTO")
 */
protected $id;

不深入研究,我假设这个关系需要Items引用回一个主键。

首先,感谢Alex,他让我知道发生了什么。

就像他说的"就学说而言,可能有两个名字相同的rare",所以,让我们把rare .name列设为唯一:

/**
 * Rarity
 *
 * @ORM'Table(name="rarities",
 *          uniqueConstraints={@ORM'UniqueConstraint(name="unique_name", columns={"name"})})
 * @ORM'Entity
 */
class Rarity
{

它工作了,没有错误,没有警告,列项。item_rare引用了variables .name,并且variables .name不是表中的主键。

我希望它能帮助别人,它花了我时间!