day16の今日は数式を使ったupdateのやり方を見ていきます。
Doctrine
<?php
declare(strict_types=1);
use App\Entity\Book;
use Doctrine\ORM\EntityManagerInterface;
require __DIR__.'/../vendor/autoload.php';
/** @var EntityManagerInterface $entityManager */
$entityManager = require __DIR__.'/bootstrap.php';
$qb = $entityManager->getRepository(Book::class)->createQueryBuilder('b');
$qb->update()->set('b.price', 'b.price * 1.1')->getQuery()->execute();
- エンティティ自身の更新ではなく、クエリビルダを使って行います。
- クエリビルダで更新した場合、取得済のBookエンティティのフィールドの値は更新されないので、更新後の値を持つエンティティを使って次の処理をしたい場合は
$entityManager->refresh($book)
のようにエンティティの値を更新する必要があります。
Eloquent
<?php
declare(strict_types=1);
use App\Models\Book;
require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/bootstrap.php';
$q = Book::query();
$q->update(['price' => $q->raw('price * 1.1')]);
- Model自体の更新ではなくクエリを使います。
- 数式部分は
raw()
で囲う必要があります。(Laravelの中で使う場合、DB::raw()
でも良い) - クエリで更新した場合、取得済のBookモデルのフィールドの値は更新されないので、更新後の値を持つモデルを使って次の処理をしたい場合は
$book->refresh()
のようにモデルの値を更新する必要があります。