【CakePHP入門】テーブルを一括更新する方法(updateAll)

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>

実行結果
image
このサンプルプログラムを実行すると、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メソッドの使い方を忘れてしまったら、この記事を思い出してくださいね。

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次