Php ORM 2原则嵌入和引用

Php ORM 2原则嵌入和引用,php,orm,doctrine-orm,Php,Orm,Doctrine Orm,ORM 2.5条令将可嵌入性添加到类中。我想知道的是,以下是否可行,如果可行,如何实现 <?php /** @Entity */ class User { /** @Embedded(class = "Address") */ private $address; } /** @Embeddable */ class Address { /** @Column(type = "string") */ private $street; ...

ORM 2.5条令将可嵌入性添加到类中。我想知道的是,以下是否可行,如果可行,如何实现

<?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
{
    ...
}

如本教程所述:

就您的数据库模式而言,条令将自动将Address类中的所有列内联到User类的表中,就像您在那里直接声明它们一样

发生的情况是,生成的表只有
User
City
地址
的信息直接合并到
用户
表中。对于您的测试用例,这将产生以下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;
}

我建议你发邮件到,他们对此反应很好。

你为什么不试试呢?顺便说一句,您可以使用orm:validate schema验证您的实体。这将告诉您您的实体是否正确。嵌入式关联永远不会实现::-(
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);