2014-09-25 66 views
1

學說ORM 2.5增加了可嵌入類,as explained here。我想知道以下是否可行,如果是的話,如何。學說ORM 2可嵌入和引用

<?php 

/** @Entity */ 
class User 
{ 
    /** @Embedded(class = "Address") */ 
    private $address; 
} 

/** @Embeddable */ 
class Address 
{ 
    /** @Column(type = "string") */ 
    private $street; 

    ... 
    /** 
    * @ManyToOne(targetEntity="City") 
    * @JoinColumn(name="city_id", referencedColumnName="id") 
    **/ 
    private $city; 
} 

/** @Entity */ 
class City 
{ 
    ... 
} 

我想,作爲AddressUser是同一表的一部分,City應參考保存到User在數據庫中。但我不確定這是否可能。任何幫助將不勝感激。

+2

你爲什麼不嘗試一下?順便說一句,你可以驗證你的實體與教條orm:validate-schema這將告訴你,如果你的實體是正確的。 – tom 2014-10-06 13:24:45

回答

2

由於本教程中指出:

在你的數據庫架構方面,學說將自動內聯從Address類爲用戶類的表中的所有列,就好像你已經宣佈他們直接出現。

發生的情況是,生成的唯一表格是UserCityAddress的信息直接合併到User表中。對於測試的情況下,這將導致以下SQL:

CREATE TABLE User (id INT AUTO_INCREMENT NOT NULL, address_street VARCHAR(255) NOT NULL, address_postalCode VARCHAR(255) NOT NULL, address_country VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB; 
CREATE TABLE City (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB; 

正如你可以看到,相對於城市是完全丟失,因爲此功能目前未實現(還)。現在,你需要保持的關係出了嵌入部分的:

<?php 

/** @Entity */ 
class User { 
    /** 
    * @Column(type="integer") 
    * @GeneratedValue 
    * @Id() 
    */ 
    protected $id; 

    /** @Embedded(class = "Address") */ 
    private $address; 

    /** @ManyToOne(targetEntity="City") */ 
    private $city; 
} 

這生成的表,你可能會想到他們,包括關係到城市:

CREATE TABLE User (id INT AUTO_INCREMENT NOT NULL, city_id INT DEFAULT NULL, address_street VARCHAR(255) NOT NULL, address_postalCode VARCHAR(255) NOT NULL, address_country VARCHAR(255) NOT NULL, INDEX IDX_E0C1DE1C8BAC62AF (city_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB; 
CREATE TABLE City (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB; 
ALTER TABLE User ADD CONSTRAINT FK_E0C1DE1C8BAC62AF FOREIGN KEY (city_id) REFERENCES City (id); 

我建議您發佈到doctrine-user mailing list,他們對similar questions的響應非常好。

+0

永遠不會實施可嵌入式的評論:https://github.com/doctrine/doctrine2/issues/4291 :-( – Arkemlar 2017-06-29 17:20:49