day12(?)の今日は集計関数を使う方法を見ていきます。
Doctrine
<?php declare(strict_types=1); use App\Entity\Author; use App\Entity\Book; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Query\ResultSetMapping; require __DIR__.'/../vendor/autoload.php'; /** @var EntityManagerInterface $entityManager */ $entityManager = require __DIR__.'/bootstrap.php'; $qb = $entityManager->getRepository(Book::class)->createQueryBuilder('b'); /** @var array<array{id: int, price_sum: int}> $rows */ $rows = $qb->leftJoin('b.author', 'a') // 第一引数はエンティティのフィールド名. エンティティ上でリレーションを定義してあればjoin条件は記述不要 ->select('a.id, sum(b.price) as price_sum') ->groupBy('a.id') ->getQuery() ->getResult() ;
- Doctrineのクエリビルダで使用できるのはSQL関数ではなくDQL関数となり、代表的なSQL関数はほぼ利用できますが、DBMS独自の文法の関数など使えないものもあります。使える関数の一覧は→ https://www.doctrine-project.org/projects/doctrine-orm/en/2.13/reference/dql-doctrine-query-language.html#dql-functions
- DQL関数は自作することもできます。
Eloquent
<?php declare(strict_types=1); use App\Models\Author; use Illuminate\Database\Eloquent\Collection; require __DIR__.'/../vendor/autoload.php'; /** @var Collection<Author> $authors1 */ $authors = Author::query()->leftJoin('books', 'books.author_id', 'authors.id') ->select('authors.id') ->selectRaw('sum(books.price) as price_sum') ->get() ; // $authorsはattributeとしてidとprice_sumのみを持つAuthorモデルのインスタンス
- 各DBMSのSQL関数が
selectRaw()
やwhereRaw()
などのxxxRaw()
シリーズの中ではそのまま使えます。しかし、それゆえにDBMS間のポータビリティはいまいちです。 - 取得できるのはAuthorモデルのインスタンスですが、idとprice_sumのみを持ち、他の値は持っていません。