Doctrine入門、EntityManagerで最低限のCRUD

EntityManager

DoctrineではEntityManagerを使っていろんな操作していきます。

追加

use App\Entities\Item;
use Doctrine\ORM\EntityManager;

/** @var EntityManager $manager */
$manager = require 'createManager.php';

$manager->persist(new Item('F', 8));
$manager->persist(new Item('A', 3));
$manager->persist(new Item('C', 6));
$manager->persist(new Item('D', 5));
$manager->persist(new Item('G', 7));
$manager->persist(new Item('E', 2));
$manager->persist(new Item('B', 4));
$manager->flush();

これを実行すると次のようにデータベースに反映されます。

まずはテーブルに複数のテーブルを追加していきます。
まずはItemエンティティを使います。

use App\Entities\Item;

次にcreateManager.phpEntityManagerのインスタンスを作成します。

$manager = require 'createManager.php';

EntityManagerのpersist()メソッドにエンティティのオブジェクトを渡します。

$manager->persist(new Item('F', 8));

追加するだけ繰り返します。
最後にflush()を実行します。

$manager->flush();

persist()を実行した時点ではまだSQLは実行されていません。
flush()を呼び出した時に初めてSQLが実行されデータベースに反映されます。

取得

主キーから一つ項目を取得します。

use App\Entities\Item;
use Doctrine\ORM\EntityManager;

/** @var EntityManager $manager */
$manager = require 'createManager.php';

$item = $manager->find(Item::class, 3);
print_r($item);

実行した結果、主キーが3Itemを取得できました。

App\Entities\Item Object
(
    [id:App\Entities\Item:private] => 3
    [name:App\Entities\Item:private] => C
    [power:App\Entities\Item:private] => 6
)

削除

use App\Entities\Item;
use Doctrine\ORM\EntityManager;

/** @var EntityManager $manager */
$manager = require 'createManager.php';

/** @var Item $item */
$item = $manager->find(Item::class, 3);

$manager->remove($item);

$manager->flush();

結果、id3の項目が削除されます。

まずは削除するアイテムを取得して、

$item = $manager->find(Item::class, 3);

削除することにしますが、

$manager->remove($item);

この時点ではまだ削除はされてません。
実際に反映されるのはflush()を呼び出してからです。

$manager->flush();

変更

use App\Entities\Item;
use Doctrine\ORM\EntityManager;

/** @var EntityManager $manager */
$manager = require 'createManager.php';

/** @var Item $item */
$item = $manager->find(Item::class, 5);
$item->setPower(777);

$manager->flush();

まず変更するアイテムを取得します。

$item = $manager->find(Item::class, 5);

Itemオブジェクトを変更します。
この時点ではまだ変更は反映されません。

$item->setPower(777);

flush()で変更を反映させます。

$manager->flush();

この流れを見るとちょっと不思議に見えるかもしれません。
EntityManagerから取得されたエンティティはその時点で管理されてます。
flush()を呼び出すと管理されたエンティティの変更が実際に反映されます。
この辺の小難しい話はもうしばらく後に書く予定です。

初期化

Doctrineの動作を細かく見るため、学習目的でデータベースの作成、削除、初期化を頻繁に繰り返してました。
テーブルの作成時に初期化する方法が分からなかったので以下のコマンドを実行して初期化するを一連の流れで使ってます。

もしcli-config.php辺りで初期化方法があれば教えていただければなと思います。

テーブルを削除して、

vendor/bin/doctrine orm:schema-tool:drop --force

テーブルを作成して、

vendor/bin/doctrine orm:schema-tool:create

データを初期化する

php item-init.php

ちなみにitem-init.phpの内容は、

use App\Entities\Item;
use Doctrine\ORM\EntityManager;

/** @var EntityManager $manager */
$manager = require 'createManager.php';

$manager->persist(new Item('F', 8));
$manager->persist(new Item('A', 3));
$manager->persist(new Item('C', 6));
$manager->persist(new Item('D', 5));
$manager->persist(new Item('G', 7));
$manager->persist(new Item('E', 2));
$manager->persist(new Item('B', 4));
$manager->flush();

certificate Docker Gutenberg Hyper-V openssl PHP React ReduxToolkit REST ubuntu WordPress オレオレ認証局 フレームワーク