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メソッドの使い方を忘れてしまったら、この記事を思い出してくださいね。