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);
次にbakeでmodelとcontrollerの雛形を自動生成します。
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アップグレードガイドを読むことで知識を更新しましょう。
まとめ
ここでは、saveを使用して追加や更新したデータをデータベースに保存したり、複数レコードを登録するsaveallの代替手法について解説しました。
saveを使用すれば編集、追加したデータを簡単にデータベースに保存することができます。
もしsaveの使い方を忘れてしまったら、この記事を思い出してくださいね。