Symfony2 で遊んでいます。

で、Doctrine2.0 でモデルを定義するときに少し困ったことが。

以下のようなモデルを想定しました。

User (id, ..)
Cart (user_id, …)

id, user_id はそれぞれ主キーで、 user_id は 外部キーです。
User は Cart を 1つしか持てないという想定で、1対1の関係です。

アノーテーションを使ってモデルを定義すると、

User側

/**
 * @orm:Id
 * @orm:Column (type="integer")
 * @orm:GeneratedValue (strategy="AUTO")
 */
protected $id;

Cart側

/**
 * @orm:Id
 * @orm:OneToOne (targetEntity="User")
 * @orm:JoinColumn (name="id", referencedColumnName="id")
 */
protected $user;

とかなるかなー、っておもって
doctrine:schema:create をやってみたんですが、Cart に主キーがないんだぜ
と怒られてしまいました。

よくよく、ドキュメントを良く読むと衝撃的なあれが。

http://www.doctrine-project.org/docs/orm/2.0/en/tutorials/composite-primary-keys.html

Doctrine 2 supports composite primary keys natively. Composite keys are a very powerful relational database concept and we took good care to make sure Doctrine 2 supports as many of the composite primary key use-cases. For Doctrine 2.0 composite keys of primitive data-types are supported, for Doctrine 2.1 even foreign keys as primary keys are supported.

間違ってるかもしれない、ほんわか翻訳

Doctrine2は最初から複合主キーに対応しています。複合主キーはとても強力なリレーショナルデータベースの概念であり、私たちは念を入れてさまざまなユースケースの複合主キーに対応したいと思います。Doctrine 2.0 ではプリミティブ型の複合主キーに対応され、2.1ではさらに外部キーを主キーとすることにも対応されています。

うほー。ってことは Doctrine2.1 を乗せないと、上のようなモデルを定義することはできないてことかー?

Leave a reply

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>