SymfonyフレームワークのDoctrine

6892 ワード

新しい標準バージョンのSymfonyフレームワークにDoctrineが統合されています.Doctrineはオブジェクト関係マッピング(ORM)であり、データベース抽象層(DBAL)でもあり、ORMとDBALを使用するとデータベースを簡単に操作できます.この記事では、SymfonyでDoctrineを使用することに重点を置きます.データベース・テーブルのモデルを作成する方法、テーブルの関係を作成する方法、データをクエリーする方法などです.
データベースの作成と構成
 Doctrine Configuration
doctrine:
    dbal:
        driver:   pdo_mysql
        host:     "%database_host%"
        port:     "%database_port%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
        charset:  utf8mb4
        collate: utf8mb4_unicode_ci 

DoctrineはPDOの最上位レベルとして、PDOをサポートするデータベース・オペレーティング・システムを操作できます.(例えばMySQL、PostgreSQL、Microsoft SQL、MongoDB、MariaDB).ここではデフォルトのデータベース文字セットとソートセットをutf 8 mb 4に設定することを推奨します.古いutf 8文字セットとは異なり、utf 8 mb 4は4バイトのUnicode符号化をサポートします.データベースのホストアドレス、ポート、データベース名、ユーザー名、パスワードは通常composerインストール時に設定されていますが、依然としてapp/config/parameters.ymlで編集します.
エンティティークラスの作成
各エンティティ(データテーブル)はクラスとして表示され、AppBundle/Entityディレクトリの下にファイルが配置されます.
// src/AppBundle/Entity/User.php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

class User
{
    private $id;
    private $name;
    private $email;
    private $password;
    private $createdAt;
} 

このクラスは、id、name、email、password、created_を持つユーザーデータテーブルを表します.atフィールド.Doctrineに各フィールドのタイプと関係を提供するために、いくつかのコメントを書きます.
 * @ORM\Entity
 * @ORM\Table(name="user")
 */
class User
{
   /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    private $id;

   /**
    * @var string
    */
    private $name;

   /**
    * @var string
    */    
    private $email;

   /**
    * @var string
    */
    private $password;

    /**
     * @ORM\Column(type="datetime")
     */
     private $createdAt;

    /**
     * @ORM\ManyToOne(targetEntity="Group", inversedBy="users")
     * @ORM\JoinColumn(name="group_id", referencedColumnName="id")
     */
    private $group;

} 

テーブル名のコメントはオプションで、省略するとDoctrineはクラス名に基づいて対応するテーブル名を自動的に生成します.上のコードでは、いくつかのフィールドのプロパティのみが表示されます.
次に、ユーザー・グループを記述するテーブルを作成します.各ユーザーは1つのユーザー・グループにのみ存在します.
// src/AppBundle/Entity/Group.php
/**
 * @ORM\Entity
 * @ORM\Table(name="group")
 */
class Group
{
   /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    private $id;

   /**
    * @var string
    */
    private $name;

   /**
    * @ORM\Column(nullable=true) 
    * @ORM\Column(type="text")
    */    
    private $description;

   /**
    * @ORM\OneToMany(targetEntity="User", mappedBy="group")
    */
    private $users;

    public function __construct()
    {
        $this->users = new ArrayCollection();
    }

}

表関係も同様に注釈に書かれていることに注意してください.OneToManyは関係の名前で、targetEntityはエンティティクラスで、JoinColumnは外部キーを定義します.また、OneToManyの関係では、構築方法で変数ArrayCollectionを宣言する必要があります.
クラス内の変数はプライベート変数として定義され、これらのプライベート変数を取得するには、変数を設定し、変数を取得する方法を作成する必要があります.これらの方法は手動で作成できますが、プロジェクトディレクトリで次のコマンドを使用すると簡単に実現できます.
php app/console doctrine:generate:entities AppBundle/Entity/User

上記のコマンドを実行すると、Userクラスは次のようになります.
/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 */
class User
{
   /**
    * @ORM\Id
    * @ORM\Column(type="integer")
    * @ORM\GeneratedValue(strategy="AUTO")
    */
    private $id;

   /**
    * @var string
    */
    private $name;

   /**
    * @var string
    */    
    private $email;

   /**
    * @var string
    */
    private $password;

    /**
     * @ORM\Column(type="datetime")
     */
     private $createdAt;

    /**
     * @ORM\ManyToOne(targetEntity="Group", inversedBy="users")
     * @ORM\JoinColumn(name="group_id", referencedColumnName="id")
     */
    private $group;

    /**
     * @return mixed
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @param mixed $id
     */
    public function setId($id)
    {
        $this->id = $id;
    }

    /**
     * @return mixed
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @param mixed $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * @return mixed
     */
    public function getEmail()
    {
        return $this->email;
    }

    /**
     * @param mixed $email
     */
    public function setEmail($email)
    {
        $this->email = $email;
    }

    /**
     * @return mixed
     */
    public function getPassword()
    {
        return $this->password;
    }

    /**
     * @param mixed $password
     */
    public function setPassword($password)
    {
        $this->password = $password;
    }

    /**
     * @return mixed
     */
    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    /**
     * @param mixed $createdAt
     */
    public function setCreatedAt($createdAt)
    {
        $this->createdAt = $createdAt;
    }

}

データベース・モードの作成と更新
Doctrineでは、すでにエンティティがある上で、次のコマンドを実行すると、データベース・モードを簡単に作成できます.
php app/console doctrine:schema:update --force

上記のコマンドは、データベース・モードを作成するだけでなく、開発中にデータベース・モードを更新します.データベースでSQLクエリーを実行する場合は、データベース・モードは推奨されず、本番環境での更新を推奨します.
データベースクエリー
ここでは、テーブル関係を定義し、データベース・モードを作成するエンティティ・クラスを作成しました.データベースでデータを作成、クエリー、更新、削除する方法について説明します.
$group = new Group();
$group->setName('Administrator');
$group->setDescription('Users with highest privileges in the system'); 

$em = $this->getDoctrine()->getManager();

// Tells Doctrine you want to save the group (no queries yet)
$em->persist($group);

// This line actually executes the SQL query
$em->flush();

作成したばかりのユーザー・グループ・テーブルでidを問合せます.
$group->getId();

データベースからデータを検索するには、次の手順に従います.
$group = $this->getDoctrine()
        ->getRepository('AppBundle:Group)
        ->find($groupId); 

データの更新:
// Fetch the group
$em = $this->getDoctrine()->getManager();
$group = $em->getRepository('AppBundle:Group)->find($groupId);

// If the group does not exist, throw an exception
if (!$group) {
   throw $this->createNotFoundException(
      'Group not found'
   );
}

// Update data
$group>setDescription('New group description.');
$em->flush();

データベースからデータを削除するには、次の手順に従います.
// Fetch group
$em = $this->getDoctrine()->getManager();
$group = $em->getRepository('AppBundle:Group)->find($groupId);

// Remove group
$em->remove($group);
$em->flush();