シムノート

PHPフレームワークSymfonyの学習帳

ユーザ用ツール

サイト用ツール


サイドバー

メニュー



このエントリーをはてなブックマークに追加

blog:2015-12-28:doctrine入門_adding_bug_and_user_entities

Doctrine入門 : (3) Bug と User エンティティの追加

エンティティの追加

BugとUserエンティティを追加します。

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="bug")
 */
class Bug
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     * @var int
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     * @var string
     */
    protected $description;

    /**
     * @ORM\Column(type="datetime")
     * @var \DateTime
     */
    protected $created;

    /**
     * @ORM\Column(type="string")
     * @var string
     */
    protected $status;
}

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 */
class User
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     * @var int
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     * @var string
     */
    protected $name;
}

リレーションの追加

クラスにオブジェクト間のリファレンスを追加することで、DBテーブル間のリレーションを作成します。

// ...

use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;

// ...
class Bug
{
    // ...
    

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="assignedBugs")
     * @var User
     */
    protected $engineer;

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="reportedBugs")
     * @var User
     */
    protected $reporter;

    /**
     * @ORM\ManyToMany(targetEntity="Product")
     * @ORM\JoinColumn(onDelete="CASCADE")
     * @Assert\Count(min="1")
     * @var Product[]
     */
    protected $products = null;
    
    
    public function __construct()
    {
        $this->products = new ArrayCollection();
    }
}

// ...

use Doctrine\Common\Collections\ArrayCollection;

// ...
class User
{
    // ...
    
    /**
     * @ORM\OneToMany(targetEntity="Bug", mappedBy="reporter")
     * @var Bug[]
     */
    protected $reportedBugs = null;

    /**
     * @ORM\OneToMany(targetEntity="Bug", mappedBy="engineer")
     * @var Bug[]
     */
    protected $assignedBugs = null;
    
    
    public function __construct()
    {
        $this->reportedBugs = new ArrayCollection();
        $this->assignedBugs = new ArrayCollection();
    }
}

オブジェクトのリファレンスにはDoctrineメタ言語でリレーションを定義します。

  • @ManyToOne: 多対1
  • @OneToMany: 1対多
  • @ManyToMany: 多対多

また、Doctrineではエンティティのコレクションは配列の代わりにArrayCollectionを使います。コンストラクタで初期化する必要があります。

Getter, Setterの追加

consoleコマンドを使って、Getter, Setterを自動生成します。

$ bin/console doctrine:generate:entities AppBundle

ここで、Getter, Setterが再生されたか、各エンティティのソースを確認してください。

DBスキーマの更新

consoleコマンドでDBスキーマを更新します。

$ bin/console doctrine:schema:update --force

更新されたDBスキーマを確認します。

$ sqlite3 var/data.db3

sqlite> .table
bug  bug_product  product  user

sqlite> .schema bug
CREATE TABLE bug (
    id INTEGER NOT NULL,
    engineer_id INTEGER DEFAULT NULL,
    reporter_id INTEGER DEFAULT NULL,
    description VARCHAR(255) NOT NULL,
    created DATETIME NOT NULL,
    status VARCHAR(255) NOT NULL,
    PRIMARY KEY(id)
);
CREATE INDEX IDX_358CBF14F8D8CDF1 ON bug (engineer_id);
CREATE INDEX IDX_358CBF14E1CFE6F5 ON bug (reporter_id);

sqlite> .schema user
CREATE TABLE user (
    id INTEGER NOT NULL,
    name VARCHAR(255) NOT NULL,
    PRIMARY KEY(id)
);

sqlite> .schema bug_product
CREATE TABLE bug_product (
    bug_id INTEGER NOT NULL,
    product_id INTEGER NOT NULL,
    PRIMARY KEY(bug_id, product_id)
);
CREATE INDEX IDX_897D061DFA3DB3D5 ON bug_product (bug_id);
CREATE INDEX IDX_897D061D4584665A ON bug_product (product_id);

※ awk を使うとスキーマを見やすく整形して表示できます。

$ sqlite3 var/data.db3 '.schema' | awk '/CREATE TABLE/ {sub("\\(", "\(\n\t"); gsub(", ", ",\n\t"); print $0}'

新しくbug, user, bug_productテーブルが作成されました。ER図にすると以下のようになります。

bug_tracker_erd.jpg


Comments



192᠎ +14 = ?
blog/2015-12-28/doctrine入門_adding_bug_and_user_entities.txt · 最終更新: 2016/02/02 16:22 by tsubo