を設定するには、私は、親テーブルに関連されるいくつかのテーブルを持っています。関係のものを解決するために「醜い」の方法は、スキーマに手動で依存関係を含めることであろう。symfonyのとDoctrineテンプレート - 私のDBスキーマでは1対多の関係
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
しかし、私はクラスを追加するたびにエリアに接続されるように、私は追加する必要があります関係とそれに付随するすべての行(コピー/ペースト=>未来の地獄)。私は私がそのような同じことを達成することを可能にする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->都市sfArea「『『上』」不明なレコードのプロパティ/関連部品』都市エラーを与えます)。
はどのように他の関係を作成することができますか?私はあなただけあなたが頭痛の多くを取得するデータベースにhirearchyのこの種を表す、大きなモデルの問題を持っていると思う
//...
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
)
);
}
ええと、スキーマのバージョンはうまくいくはずです...私が見る唯一の問題は、あなたの 'foreignAlias'は各クラス、すなわち' Cities'と 'Items'で異なるはずだということです。一方、ハードコーディングされたバージョンには問題があります。 – prodigitalson
こんにちは、ちょっと、タイプミスを修正しました。それは私の大きな問題です。手作業のコピーを貼り付けるのを避けるため、AreaRelatedテンプレートを動作させるのが大好きです。 –
少しのコピー/ペースト/タイピングを避けるために多くの作業があるようです。わからない、私のスキーマはそれを頻繁に変えない。 – Nathan