In meinem DB-Schema habe ich mehrere Tabellen, die sich auf eine Elterntabelle beziehen. Die „hässlich“ Art und Weise, die die Beziehung Sachen zu lösen würden die Abhängigkeiten manuell im Schema enthalten sein:Symfony und Doctrine Templates - Einrichten einer Eins-zu-viele-Beziehung
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
jedoch jedes Mal, wenn ich eine Klasse hinzufügen, wird dem Bereich angebracht werden, ich muss hinzufügen die Relation und alle damit verbundenen Zeilen (copy/paste => future hell). Hier habe ich beschlossen, die Doctrine_Template zu verwenden, was mir das gleiche wie das zu erreichen erlaubt:
sfArea:
columns:
id: integer
name: string
sfCity:
actAs:
AreaRelated: { foreignAlias: Cities }
columns:
name: string
sfItem:
actAs:
AreaRelated: { foreignAlias: Items }
columns:
name: string
und die Template-Klasse:
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']
)
);
}
}
Die Tabellen korrekt erzeugt werden und die Beziehung funktioniert in die Richtung $ sfCity-> Area. Die Beziehungen, die in der Klasse sfArea eingerichtet werden sollten, werden jedoch nicht erstellt ($ sf_area-> Cities gibt den Fehler "Unbekannte Datensatzeigenschaft/zugehörige Komponente" Cities "in" sfArea "" an).
Wie kann die andere Beziehung erstellt werden? Ich habe sogar versucht, dass (ohne Erfolg):
//...
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
)
);
}
Hmm die Schema-Version sollte funktionieren Ich denke ... das einzige Problem, das ich sehe, ist, dass Ihre 'ForeignAlias' für jede Klasse anders sein sollten, dh' Cities' und 'Items'. Die hardcoded Version dagegen hat Probleme. – prodigitalson
Hi, yep, korrigierte die Tippfehler (kein Tippfehler in meinem ursprünglichen Code, nur hier). Das ist mein großes Problem, um viel manuelle Kopie zu vermeiden, würde ich gerne die AreaRelated-Vorlage arbeiten lassen. –
Scheint wie eine Menge Arbeit, um ein wenig Kopieren/Einfügen/Tippen zu vermeiden. Ich weiß nicht, meine Schemata ändern sich nicht so oft. – Nathan