В моей схеме БД у меня есть несколько таблиц, которые будут связаны с родительской таблицей. «Гадкий» способ решить проблему отношений состоит в том, чтобы вручную включить зависимости в схему:
sfArea:
columns:
id: integer
name: string
sfCity:
columns:
name: string
area_id: integer
relations:
Area:
class: sfArea
local: area_id
foreignType: many
foreignAlias: Cities
sfItem:
columns:
name: string
area_id: integer
relations:
Area:
class: sfArea
local: area_id
foreignType: many
foreignAlias: Items
Однако каждый раз, когда я добавляю класс, который будет присоединен к области, мне нужно будет добавлять отношение и все строки, которые идут с ним (copy / paste => future hell). Здесь я решил использовать Doctrine_Template, который позволяет мне достичь того же:
sfArea:
columns:
id: integer
name: string
sfCity:
actAs:
AreaRelated: { foreignAlias: Cities }
columns:
name: string
sfItem:
actAs:
AreaRelated: { foreignAlias: Items }
columns:
name: string
И шаблон класса:
class AreaRelated extends Doctrine_Template
{
protected $_options = array(
'foreignAlias' => ''
);
public function setTableDefinition()
{
$this->hasColumn('area_id', 'integer');
}
public function setUp()
{
$this->hasOne('sfArea as Area', array(
'local' => 'area_id',
'foreign' => 'id',
'foreignType' => 'many',
'foreignAlias' => $this->_options['foreignAlias']
)
);
}
}
Таблицы сгенерированы правильно, и отношение работает в направлении $ sfCity-> Area. Однако отношения, которые должны быть установлены в классе sfArea, не создаются ($ sf_area-> Cities выдает ошибку "Неизвестное свойство записи / связанный компонент" Cities "в" sfArea "").
Как можно создать другое отношение? Я даже попробовал это (без успеха):
//...
public function setUp()
{
$thisTable = $this->_table;
$areaTable = Doctrine::getTable("smArea");
$thisTable->hasOne('smArea as Area', array(
'local' => 'area_id',
'foreign' => 'id',
'foreignType' => Doctrine_Relation::MANY
)
);
$areaTable->hasMany($thisTable->getOption('name') . ' as ' . $this->_options['foreignAlias'], array(
'local' => 'id',
'foreign' => 'area_id',
'foreignType' => Doctrine_Relation::ONE
)
);
}