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のみを持ち、他の値は持っていません。