2013-07-31 2 views
2

Как создать сущность динамически в доктрине на основе абстрактного класса сущности? Имена таблиц должны отличаться. НапримерDoctrine - создать модель/сущность динамически

// abstract entity model 
class Transport { 
    // $name, $type and other columns 
} 

И создание выглядит следующим образом:

class TransportManager { 

public function registerTransport($name) { 
$car = ... 
// here create table $name if does not exist, 
// and if it exists then just 
// return Car instance of this $name table 
return $car; 

} 

использования:

$car = $transportManager->registerTransport('car'); 
$airplain = $transportManager->registerTransport('airplain'); 
$train = $transportManager->registerTransport('train'); 
$helicopter = $transportManager->registerTransport('helicopter'); 

причина? У меня есть несколько (> 10) таблиц с такой же структурой, и я хочу, чтобы сохранить все данные в отдельных таблицах для предотвращения orverloading каждой таблицы

+0

Что вы подразумеваете под «той же структурой»? Угадайте, что вы можете решить по составу сущностей, а не по наследству. – moonwave99

+0

Я имею в виду несколько таблиц и одну и ту же схему таблиц, и да, нет необходимости в наследовании – pleerock

+0

Если у вас есть та же схема базы данных, у вас есть тот же объект [с другим полем transportType], которое я предполагаю]. Если вы хотите иметь разные таблицы с общими полями, загляните в [Наследование доктрины наследования] (http://docs.doctrine-project.org/en/2.0.x/reference/inheritance-mapping.html). – moonwave99

ответ

0

Доктрины поддерживает наследование: http://docs.doctrine-project.org/en/2.0.x/reference/inheritance-mapping.html

Вы также можете партию генерировать новые объекты , но это зависит от вашего рабочего процесса (например, создайте код для новых объектов, выполните миграцию, выполните миграции и т. д.)

+0

Я уже использую наследование, он уменьшает код, но все же, я не удовлетворен. Прочтите комментарии по моему вопросу – pleerock

0

Используйте один стол. При правильном индексировании он не должен быть медленнее, чем использовать несколько таблиц, даже если он огромен.

0

Я хотел бы попробовать что-то вроде этого, хотя и не совсем подхода вы пытаетесь:

$metadata = $cmf->getMetadataFor('YourBundle:Transport'); 
$metadata->setTableName('car'); 
//work with car 
$metadata->setTableName('airplain'); 
//work with airplain 

Надеется, что она служит.

Смежные вопросы