【CakePHP入門】saveでデータを保存する方法

こんにちは!フリーエンジニアのヤマシタです。

CakePHPにはデータベースの内容を編集したり、追加したデータを保存する機能があります。

この記事では、

・saveとは?
・saveの基本的な使い方
・追加したデータを保存する方法
・更新したデータを保存する方法

という基本的な内容から、

・複数データを保存する方法(saveallの代替)

などの応用的な使い方について解説します。

ここではsaveでデータを保存する方法について、詳しく解説していきます!

saveとは

プログラム内で読み込んだデータベースに内容を追加したり、削除したあとに変更内容を保存するには、saveメソッドを使用します。

saveメソッドは取得したデータベースのインスタンスに対して実行されます。

$fruitsTable = TableRegistry::getTableLocator()->get('fruits');
$newfruits = $fruitsTable->newEntity();

テーブル更新処理・・・

$fruitsTable->save($newfruits);

saveの使い方

ここでは、実際にsaveの使い方を見ていきましょう。

事前準備として、以下のデータベースを作成しておきます。

CREATE TABLE fruits (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(32),
    value INT
);

続いて、INSERT文でデータを設定します。

INSERT INTO fruits (name, value) VALUES ('"apple"', 100);
INSERT INTO fruits (name, value) VALUES ('"orange"', 80);
INSERT INTO fruits (name, value) VALUES ('"melon"', 500);

次にbakemodelcontrollerの雛形を自動生成します。

modelの作成

bin/cake bake model fruits

controllerの作成

bin/cake bake controller fruits

bakeについては、以下の記事で詳しく解説していますので、ぜひ参考にしてくださいね。

作成された「Cake/src/Controller/FruitsController.php」を以下のように編集します。

Cake/src/Controller/FruitsController.php

<?php
namespace AppController;

use AppControllerAppController;
use CakeEventEvent;
use CakeORMTableRegistry;

class FruitsController extends AppController
{

    function beforeFilter(Event $event) {
        //テーブルを取得
        $fruitsTable = TableRegistry::getTableLocator()->get('fruits');
        $newfruits = $fruitsTable->newEntity();

        $newfruits->name = 'pineapple';
        $newfruits->value = '450';

        //データを保存する
        if ($fruitsTable->save($newfruits)) {
            $id = $newfruits->id;
        }
    }

    public function index()
    {
        $this->set('fruits', $this->Fruits->find('all'));
    }
}

ここでは、共通処理のコールバックメソッドbeforeFilterでテーブルの追加及びsaveメソッドを使用して保存処理を行っています。

beforeFilterメソッドを使用するには、「use CakeEventEvent;」を定義します。

beforeFilterメソッドの詳細については、以下の記事でも詳しく解説しています!

また、テーブルの操作を行うときはTableRegistryを指定してインスタンスを取得する必要があります。

TableRegistryなどのテーブルオブジェクトを使用するには「use CakeORMTableRegistry;」を定義する必要があります。

次にindex.ctpファイルを作成します。

Cake/src/Template/Fruits/index.ctp

<h1>Fruits</h1>
<table>
    <tr>
        <th>Id</th>
        <th>name</th>
        <th>value</th>
    </tr>

    <?php foreach ($fruits as $item): ?>
    <tr>
        <td><?= $item->id ?></td>
        <td><?= $item->name ?></td>
        <td><?= $item->value ?></td>
        </td>
    </tr>
    <?php endforeach; ?>
</table>

実行結果

フルーツテーブルの出力

このサンプルプログラムを実行すると、FruitsControllerで追加したpineappleが反映されていることがわかりますね!

このようにsaveメソッドを使用すれば、プログラム内でテーブルの編集や保存といった操作が可能になります。

データの更新

テーブルの内容を更新するときは、作成したデータベースのインスタンスに対して、getメソッドでidを指定します。

以下ではid:2のデータを取得し、内容を更新してsaveメソッドで保存しています。

$fruitsTable = TableRegistry::getTableLocator()->get('fruits');
$newfruits = $fruitsTable->get(2);

$newfruits->name = 'strawberry';
$fruitsTable->save($newfruits);

複数のレコードを保存する方法

複数のレコードを保存するにはCakePHP2.x系まではsaveallを使用していましたが、CakePHP3ではORMの変更に伴いsaveallが利用できなくなりました。

代わりに複数のレコード(エンティティ)を保存する方法として、saveManyが提供されています。

以下にsaveManyを使用して、複数レコードを保存する方法を記述します。

// データを複数追加する
$fruitsdata = [
[
      'fruits' => 'pineapple',
      'value' => 450
],
[
      'fruits' => 'strawberry',
      'value' => 500
],
];

$fruitsTable = TableRegistry::getTableLocator()->get('fruits');
$entities = $fruitsTable->newEntities($fruitsdata);
$result = $fruitsTable->saveMany($entities);

CakePHP2系に慣れ親しんでいる方はORMの変更でかなり感覚が変わると思われます。

そういった方は公式の新ORMアップグレードガイドを読むことで知識を更新しましょう。

参照:新ORMアップグレードガイド

まとめ

ここでは、saveを使用して追加や更新したデータをデータベースに保存したり、複数レコードを登録するsaveallの代替手法について解説しました。

saveを使用すれば編集、追加したデータを簡単にデータベースに保存することができます。

もしsaveの使い方を忘れてしまったら、この記事を思い出してくださいね。

LINEで送る
Pocket

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

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

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

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

cta_under_bnr

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

書いた人

ヤマシタ

システムエンジニアとして10年勤務→フリーランスへ。現在は侍ブログ編集部として、これまでに200記事以上の記事を執筆。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。プログラミング初学者に向けてわかりやすく、ためになるコンテンツ作りを心がけています。

おすすめコンテンツ

いまならレッスン期間が2週間延長!この秋、プログラミングを学ぼう

転職成功で受講料0円!あなたもプログラミングを学んでエンジニアデビュー