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

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

ヤマシタ

システムエンジニアとして10年勤務→フリーランスへ。現在は侍ブログ編集部としてこれまでに200記事以上の記事を執筆。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。