2014年5月8日木曜日

Symfony2でDoctrine2使う時によく使うEntityのアノテーション一覧とDoctrine2のコマンド一覧

Symfony2シリーズ第二弾です。
Doctrine2はアノテーションでEntityの関係や属性を指定出来るので便利です。
ただドキュメントが英語だったので自分用によく使うヤツをまとめて置いときます。

公式ドキュメント(アノテーション一覧)

/**
 * UNIQUE制約のIndexを作るとき
 * nameを指定しない場合はIDX_6E72A8C13B66675Bのように種類_ランダムの名前が付けられる
 * @ORM\Table(name="テーブル名", uniqueConstraints={@UniqueConstraint(name="キー名", columns={"カラム名"})})
 * 複数指定もできる
 * @ORM\Table(name="テーブル名", uniqueConstraints={@UniqueConstraint(columns={"カラム名", "カラム名"})})
 *
 * Indexを指定したい時
 * @ORM\Table(name="テーブル名", indexes={@index(columns={"カラム名"})})
 * 複数指定もできる
 * @ORM\Table(name="テーブル名", indexes={@index(columns={"カラム名", "カラム名"})})
 *
 **/
class テーブル名
{
    /**
     * ID
     *
     * @var integer
     * 
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * オートインクリメントの指定
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * ほげ(外部キー貼る側)
     * 外部制約(リレーションを指定するときは名前空間を指定すると補完が効く
     * @var \project\MyBundle\Entity\Hoge\Hoge
     * リレーションの指定
     * @ManyToOne(targetEntity="\project\MyBundle\Entity\Hoge\Hoge", inversedBy="hoge")
     * @JoinColumn(name="hoge_id", referencedColumnName="id")
     * */
    private $hoge;

    /**
     * ほげ(外部キー貼られる側)
     * 外部キー貼られる側も指定がいる
     * @var \Doctrine\Common\Collections\ArrayCollection
     * カスケードの動作等は貼られる側で指定する
     * @OneToMany(targetEntity="\project\MyBundle\Entity\Hoge\Hoge", mappedBy="hoge", cascade={"persist","remove"})
     * */
    private $hoge;
 
     /**
     * 登録日時
     *
     * @var \DateTime
     *
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(name="created_at", type="datetime")
     */
    private $createdAt;

    /**
     * 更新日時
     *
     * @var \DateTime
     *
     * @Gedmo\Timestampable(on="update")
     * @ORM\Column(name="updated_at", type="datetime")
     */
    private $updatedAt;
}

注意が必要なのはリレーションを定義するときは両方のEntityにアノテーションを記載する必要があります。
そしてSQL的にはカスケードの条件は外部キーを貼る側に記載しますがアノテーションは外部キーを貼られる側に記載します。
というよりも実際にカスケードの条件はDDLとしては付与されてません。
アノテーションでのカスケード処理はDoctrineが処理する際に行うだけで実際のDBのDDLには関与しないので注意が必要です。
同じようにdefaultやon="create"も同様です。
DDLとしてdefaultやtimestamp型が使われるわけではないのです。
このへんはDBとコードが不一致なので動作については注意が必要ですね。

それとDoctrine2のよく使うCUIコマンドです。

//DBの作成
php app/console doctrine:database:create

//エンティティの作成
php app/console doctrine:generate:entity --entity="MyBundle:Entity名" --fields="name:string(255) price:float description:text"

//ゲッター・セッターの作成
php app/console doctrine:generate:entities project名/MyBundle/Entity/エンティティ名

//全部のエンティティの作成
php app/console doctrine:generate:entities projectMyBundle

//テーブルの作成
php app/console doctrine:schema:update --force

//データの投入
php app/console doctrine:fixtures:load --env=test


Doctrine2でDBマイグレーションを管理すると環境の複製やリリース等が簡単になります。
またFuelPHP2.0でもDoctrineを採用するようです。
PHPフレームワークのDBのスタンダードになりつつあるのでDoctrine2を覚えておいて損はないと思います。
(NetBeansはDoctrine2対応していますしね!)


ということで今日のところは以上です。