Doctrine入門、EntityRepositoryを使った取得系

リポジトリでの操作

前回は$manager->find(Item::class, 3)といったように最低限の取得にとどまりました。
今回はEntityRepositoryを使って行きます。

Itemの一覧を取得

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

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

/** @var EntityRepository $repository */
$repository = $manager->getRepository(Item::class);

/** @var array<Item> $items */
$items = $repository->findAll();

foreach($items as $item)
{
    echo "{$item->getId()} - {$item->getName()} :  {$item->getPower()}\n";
}
1 - F :  8
2 - A :  3
3 - C :  6
4 - D :  5
5 - G :  7
6 - E :  2
7 - B :  4

まずはEntityManagerからItemに関連付けられたEntityRepositoryを取得します。

$repository = $manager->getRepository(Item::class);

EntityRepositoryを使ってItemのエンティティをすべて取得します。

$items = $repository->findAll();

Itemテーブルから取得してきたレコードをItemエンティティに変換して取得できます。
戻り値はItemインスタンスの配列です。

この内容はSQLではこんな感じをイメージしてください。

SELECT * FROM Item;

主キーから取得

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

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

/** @var EntityRepository $repository */
$repository = $manager->getRepository(Item::class);

/** @var Item|null $item */
if($item = $repository->find(5))
{
    echo "{$item->getId()} - {$item->getName()} :  {$item->getPower()}\n";
}
5 - G :  7
$item = $repository->find(5)

id5Itemを取得します。

条件付きで取得

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

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

/** @var EntityRepository $repository */
$repository = $manager->getRepository(Item::class);

/** @var array<Item> $items */
$items = $repository->findBy(['name' => 'C']);

foreach($items as $item)
{
    echo "{$item->getId()} - {$item->getName()} :  {$item->getPower()}\n";
}
3 - C :  6
$items = $repository->findBy(['name' => 'C']);

カラム名nameCItemを取得します。
配列で返ります。

SQLだとこんな感じでしょうか。

SELECT * FROM Item WHERE Item.name = 'C';

複雑な条件付きで取得

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

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

/** @var EntityRepository $repository */
$repository = $manager->getRepository(Item::class);

/** @var array<Item> $items */
$items = $repository->findBy(
    [
        'name' => ['C', 'D', 'G', 'E', 'B'],
        'id' => [1, 2, 3, 4, 5]
    ],
    [
        'power' => 'DESC'
    ]
);

foreach($items as $item)
{
    echo "{$item->getId()} - {$item->getName()} :  {$item->getPower()}\n";
}
5 - G :  7
3 - C :  6
4 - D :  5

この例ではnameC,D,G,E,Bかつid1,2,3,4の場合取得します。
カラムがpowerで降順で取得されます。
SQLにするとこんな感じでしょうか。

SELECT * FROM Item
    WHERE id IN(1, 2, 3, 4, 5) AND name IN('C', 'D', 'G', 'E', 'B')
    ORDER BY power DESC;

範囲指定して取得

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

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

/** @var EntityRepository $repository */
$repository = $manager->getRepository(Item::class);

/** @var array<Item> $items */
$items = $repository->findBy(
    [ ],
    null,
    3,
    3
);

foreach($items as $item)
{
    echo "{$item->getId()} - {$item->getName()} :  {$item->getPower()}\n";
}
4 - D :  5
5 - G :  7
6 - E :  2

SQL(MySQL)でいうとこんな感じ。

SELECT * FROM Item LIMIT 3, 3;

0から数えて3番目から3項目取得します。

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