CakePHPではデータベースのテーブルの値を一括で更新する便利なメソッドが用意されています。
この記事ではテーブルを一括更新する処理について、
・updateallメソッドとは
・updateallメソッドの基本的な使い方
・saveでデータを保存する方法
などの基本的な内容から、
・updateメソッドを使用したメソッドチェーンで一括更新する方法
などの応用的な使い方についても解説します。
ここでは、そんなデータベースのテーブルのデータを一括で更新する方法について、詳しく解説していきます!
updateallでデータを一括更新する方法
updateallとは
テーブルの値を変更するときに、指定した条件の値の場合に一括で変更を行いたいときはupdtateallメソッドを使用します。
updateallメソッドは以下のように記述します。
$テーブルオブジェクト->updateAll(
[‘更新対象のカラム’ => 更新する値],
[‘更新条件のカラム’ => 条件の値]
);
updateAllメソッドを実行すると、該当する更新条件のカラムの条件の値が評価され、一致した値が存在した場合は全て更新する値に置き換えられて、テーブルが更新されます。
updateallの基本的な使い方
ここでは、実際にupdateallの使い方を見ていきましょう。
事前準備として、以下のデータベースを作成しておきます。
CREATE TABLE fruits (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
item VARCHAR(32),
value INT
);
INSERT INTO fruits (item, value) VALUES ('"apple"', 100);
INSERT INTO fruits (item, value) VALUES ('"orange"', 80);
INSERT INTO fruits (item, value) VALUES ('"melon"', 500);
INSERT INTO fruits (item, value) VALUES ('"pineapple"', 700);
INSERT INTO fruits (item, value) VALUES ('"strawberry"', 450);
次にbakeでmodelとcontrollerの雛形を自動生成します。
modelの作成
bin/cake bake model fruits
controllerの作成
bin/cake bake controller fruits
bakeについては、以下の記事で詳しく解説していますので、ぜひ参考にしてくださいね。
作成された「Cake/src/Controller/FruitstableController.php」を以下のように編集します。
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Event\Event;
use Cake\ORM\Table;
use Cake\ORM\TableRegistry;
class FruitsController extends AppController
{
function beforeFilter(Event $event) {
//テーブルを取得
$fruitsTable = TableRegistry::get('fruits');
//valueの値が200より大きい場合は100に変更
$fruitsTable->updateAll(
['value' => 100],
['value > ' => 200]
);
}
public function index()
{
$this->set('fruits', $this->Fruits->find('all'));
}
}
ここでは、共通処理のコールバックメソッドbeforeFilterでupdateallメソッドを使用して一括更新処理を行っています。
beforeFilterメソッドを使用するには、「use Cake\Event\Event;」を定義します。
beforeFilterメソッドの詳細については、以下の記事でも詳しく解説しています!
また、テーブルの操作を行うときはTableRegistryを指定してインスタンスを取得する必要があります。
TableRegistryなどのテーブルオブジェクトを使用するには「use Cake\ORM\TableRegistry;」を定義する必要があります。
次にindex.ctpファイルを作成します。
Cake/src/Template/Fruits/index.ctp
<h1>Fruits</h1>
<table>
<tr>
<th>Id</th>
<th>fruits</th>
<th>value</th>
</tr>
<?php foreach ($fruits as $item): ?>
<tr>
<td><?= $item->id ?></td>
<td><?= $item->item ?></td>
<td><?= $item->value ?></td>
</td>
</tr>
<?php endforeach; ?>
</table>
実行結果

このサンプルプログラムを実行すると、FruitsController.phpで実行したupdateAllメソッドにより、valueの値が200以上のデータは、値を全て100に変更してテーブルを更新しています。
このようにupdateAllメソッドを使用することにより、指定した条件の値を簡単に一括で更新可能なことがわかりますね!
updateで一括更新する方法
QueryBuilderを使用してデータをupdateする場合はupdateメソッドを使用します。
updateメソッドでもメソッドチェーンを使用することにより、より柔軟なインターフェイスを使用することも可能です。
以下のサンプルプログラムは、updateallメソッドの使用箇所をupdateメソッドを使用したメソッドチェーンに置き換えたサンプルです。
//テーブルを取得
$fruitsTable = TableRegistry::get('fruits');
$fruitsTable->query()
->update()
->set(['value' => 100])
->where(['value > ' => 200])
->execute();
このサンプルを実行しても、updateallと同様に条件に一致した値が全て更新されます。
QueryBuilderの使い方については、以下の記事で詳しく解説しています!
saveでデータを保存する方法
saveとは
テーブルの更新ではなく、値を追加して保存する場合にはsaveメソッドを使用します。
saveメソッドはテーブルのインスタンス生成後にテーブルにデータを追加し、その後にsaveメソッドを実行します。
//テーブルのインスタンスを生成する
$articlesTable = TableRegistry::get('Articles');
$article = $articlesTable->newEntity();
テーブル更新処理・・・
//テーブルを保存する
$articlesTable->save($article)
saveメソッドの使い方については、以下の記事で詳しく解説しています!
まとめ
ここではupdateAllメソッドによるテーブルの一括更新をする方法や、updateメソッドによるメソッドチェーンでデータを更新する方法、saveメソッドの使い方についても解説しました。
updateAllメソッドは、テーブルの値を一括で更新するときに非常に便利ですので、この機会にぜひ覚えておきましょう!
もしupdateAllメソッドの使い方を忘れてしまったら、この記事を思い出してくださいね。






