Doctrine ORM 2 Embeddables and References

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 в базе данных. Но я не уверен, возможно ли это вообще. Любая помощь будет оценена.

1

Решение

Как говорится в учебнике:

С точки зрения схемы вашей базы данных, 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, они были очень отзывчивы на похожие вопросы.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]