【CakePHP】データの一括更新(saveall)を行う

2019年7月29日

バージョン:CakePHP 2.x

saveallを使ってデータの一括更新を行う方法です。
Usersテーブルにidとnameというフィールドがあり、nameを一括で更新する簡単なサンプルを記載します。

<?php
class UsersController extends AppController {
	function beforeFilter(){
		parent::beforeFilter();
	}
	public function index() {
		// ポストデータがあれば保存をする(保存ボタンが押された場合)
		if ($this->request->is('post')) {
			//保存する
			if ($this->User->saveall($this->request->data['User'])) {
				// メッセージをセットしてリダイレクトする
				$this->Session->setFlash('データを登録しました!');
				return $this->redirect(array('action'=>'index'));
			}
			else
			{
				//保存が失敗した場合のメッセージ
				$this->Session->setFlash('登録に失敗しました');
			}
		}
		
		$users = $this->User->find('all');
		$this->set('users', $users);
	}
}
<?php
class User extends AppModel {
}
<?php echo $this->Session->flash() . PHP_EOL;?>
<?php echo $this->Form->create('User') . PHP_EOL; ?>
<?php foreach($users as $key => $user): ?>
<?php echo $this->Form->input("{$key}.id", array('type'=>'hidden', 'value'=>$user['User']['id']))  . PHP_EOL; ?>
<?php echo $this->Form->input("{$key}.name", array('value'=>$user['User']['name'])) . PHP_EOL; ?>
<?php endforeach; ?>
<?php echo $this->Form->submit('保存') . PHP_EOL;?>
<?php echo $this->Form->end() . PHP_EOL; ?>

実際の出力(HTML)は下記のようになります。

<div id="flashMessage" class="message">データを登録しました!</div>
<form action="/cakephp-2.4.7/users" id="UserIndexForm" method="post" accept-charset="utf-8">
	<div style="display:none;"><input type="hidden" name="_method" value="POST"/></div>
	<input type="hidden" name="data[User][0][id]" value="3" id="User0Id"/>
	<div class="input text"><label for="User0Name">Name</label><input name="data[User][0][name]" value="aaa" maxlength="50" type="text" id="User0Name"/></div>
	<input type="hidden" name="data[User][1][id]" value="2" id="User1Id"/>
	<div class="input text"><label for="User1Name">Name</label><input name="data[User][1][name]" value="bbb" maxlength="50" type="text" id="User1Name"/></div>
	<div class="submit"><input  type="submit" value="保存"/></div>
</form>

参考:公式サイト(データを保存する)

スポンサーリンク