Doctrine 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
являются частью одной таблицы, City
следует сохранить ссылку на User
в базе данных. Но я не уверен, возможно ли это вообще. Любая помощь будет оценена.
Как говорится в учебнике:
С точки зрения схемы вашей базы данных, Doctrine автоматически встроит все столбцы из класса Address в таблицу класса User, как если бы вы объявили их прямо там.
Что происходит, так это то, что генерируются только таблицы User
а также City
, Информация о Address
непосредственно слит в 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;
Как видите, отношение к City полностью отсутствует, поскольку эта функциональность в настоящее время не реализована (пока). На данный момент вам нужно сохранить отношения вне встраиваемых объектов:
<?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, они были очень отзывчивы на похожие вопросы.
Других решений пока нет …