SlideShare a Scribd company logo
1 of 7
[CakePHP 2.x]
複数レコードの同時保存
jQueryをちょっとだけ使います
Github:
https://github.com/mizoe/cakephp2_save_multi_records
想定するテーブル
• Customers
• id, created, modified, name(varchar)
• Addresses
• id, created, modified, address(varchar), customer_id
- Customer has many Addresses
- Address belongs to Customer
Bake直後
レコード保存の流れ: Customer新規作成 → Address追加
これを Customer追加の画面において、複数のAddressを追加できるようにしていく
CustomersController.php にメソッドadd_all追加
• add()からコピペして編集
if ($this->Customer->addAll($this->request->data)) {
$this->Session->setFlash(__('The customer has been saved.'));
return $this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The customer could not be saved. Please, try again.'));
}
ここだけちょっと変更。モデルのaddAll()を呼び出します。
引数はPOSTでもらったものをそのまま。
Model: Customer.php
public function addAll($data = null) {
if($data == null){ // レコードがなければ return
return false;
}
$result = $this->saveAll($data); // Cusotmer に保存
return true;
}
モデル間のアソシエーションが定義済みなので、saveAll()を実行すると
実はsaveAssociated() が呼び出される。
saveAssosicated は適切なデータを与えるだけで、いろいろやってくれる。
今回の場合、Customer を追加してその ID を獲得し、Address の customer_id に
割り当てる。もしすべてのレコードが保存できなければ、トランザクションをたどって
保存する前の状態に戻す(DBがトランザクションをサポートしていれば)。
詳細: http://book.cakephp.org/2.0/ja/models/saving-your-data.html
View : add_all.ctp
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
var $i = 1;
$('#add_address').click(function(e) {
var inputAddress = '<div class="input text required"><label for="Address' + $i + 'Address">Address</label>' +
'<input name="data[Address][' + $i + '][address]" maxlength="255" type="text" id="Address' + $i + 'Address" required="required"/></div>'
$('#add_address').before(inputAddress);
$i++;
});
});
</script>
<div class="customers form">
<?php echo $this->Form->create('Customer'); ?>
<fieldset>
<legend><?php echo __('Add Customer with Address'); ?></legend>
<?php
echo $this->Form->input('name');
echo $this->Form->input('Address.0.address');
?>
<div class="submit" id="add_address"><input type="button" value="住所追加"/></div>
</fieldset>
<?php echo $this->Form->end(__('実行')); ?>
</div>
<div class="actions">
<h3><?php echo __('Actions'); ?></h3>
<ul>
<li><?php echo $this->Html->link(__('顧客一覧'), array('action' => 'index')); ?></li>
<li><?php echo $this->Html->link(__('住所一覧'), array('controller' => 'addresses', 'action' => 'index')); ?> </li>
<li><?php echo $this->Html->link(__('新しい住所'), array('controller' => 'addresses', 'action' => 'add')); ?> </li>
</ul>
</div>
ボタンを押すと input フィールド追加
Bakeされたadd.ctpとほぼ同じ
できたー
https://github.com/mizoe/cakephp2_save_multi_records

More Related Content

What's hot

CakeRequest::onlyAllow() について
CakeRequest::onlyAllow() についてCakeRequest::onlyAllow() について
CakeRequest::onlyAllow() についてYuya Takahashi
 
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトKiyoshi Sawada
 
Development app-with-elixir
Development app-with-elixirDevelopment app-with-elixir
Development app-with-elixirk1complete
 
カジュアルにソースコードリーディング
カジュアルにソースコードリーディングカジュアルにソースコードリーディング
カジュアルにソースコードリーディングAkihiro Okuno
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~leverages_event
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScriptAshitaba YOSHIOKA
 
Rails3.1rc4を試してみた
Rails3.1rc4を試してみたRails3.1rc4を試してみた
Rails3.1rc4を試してみたTakahiro Hidaka
 
20150530 pgunconf-pgbench-semi-structured-benchmark
20150530 pgunconf-pgbench-semi-structured-benchmark20150530 pgunconf-pgbench-semi-structured-benchmark
20150530 pgunconf-pgbench-semi-structured-benchmarkToshi Harada
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnKoji Ishimoto
 
もにかじ2 lt @studio3104
もにかじ2 lt @studio3104もにかじ2 lt @studio3104
もにかじ2 lt @studio3104Satoshi Suzuki
 
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトKiyoshi Sawada
 
PHP Object Injection入門
PHP Object Injection入門PHP Object Injection入門
PHP Object Injection入門Yu Iwama
 
Chiba.pm #1 lt @studio3104
Chiba.pm #1 lt @studio3104Chiba.pm #1 lt @studio3104
Chiba.pm #1 lt @studio3104Satoshi Suzuki
 
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみましたEucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみましたEtsuji Nakai
 
Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104Satoshi Suzuki
 

What's hot (19)

Ci tutorial
Ci tutorialCi tutorial
Ci tutorial
 
CakeRequest::onlyAllow() について
CakeRequest::onlyAllow() についてCakeRequest::onlyAllow() について
CakeRequest::onlyAllow() について
 
Teclab3
Teclab3Teclab3
Teclab3
 
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
 
Development app-with-elixir
Development app-with-elixirDevelopment app-with-elixir
Development app-with-elixir
 
WDD2012_SC-004
WDD2012_SC-004WDD2012_SC-004
WDD2012_SC-004
 
カジュアルにソースコードリーディング
カジュアルにソースコードリーディングカジュアルにソースコードリーディング
カジュアルにソースコードリーディング
 
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
「スピード」と「品質」を実現するPHP開発チームの取り組み~AngularJS+FuelPHP+AspectMock~
 
今さら始めるCoffeeScript
今さら始めるCoffeeScript今さら始めるCoffeeScript
今さら始めるCoffeeScript
 
Rails3.1rc4を試してみた
Rails3.1rc4を試してみたRails3.1rc4を試してみた
Rails3.1rc4を試してみた
 
20150530 pgunconf-pgbench-semi-structured-benchmark
20150530 pgunconf-pgbench-semi-structured-benchmark20150530 pgunconf-pgbench-semi-structured-benchmark
20150530 pgunconf-pgbench-semi-structured-benchmark
 
JavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 AutumnJavaScript/CSS 2015 Autumn
JavaScript/CSS 2015 Autumn
 
もにかじ2 lt @studio3104
もにかじ2 lt @studio3104もにかじ2 lt @studio3104
もにかじ2 lt @studio3104
 
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
 
PHP Object Injection入門
PHP Object Injection入門PHP Object Injection入門
PHP Object Injection入門
 
Chiba.pm #1 lt @studio3104
Chiba.pm #1 lt @studio3104Chiba.pm #1 lt @studio3104
Chiba.pm #1 lt @studio3104
 
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみましたEucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
EucalyptusのHadoopクラスタとJaqlでBasket解析をしてHiveとの違いを味わってみました
 
Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104Yapc -asia 2012 lt @studio3104
Yapc -asia 2012 lt @studio3104
 
Ll xcode
Ll xcodeLl xcode
Ll xcode
 

Similar to CakePHP 2.x 複数レコード同時保存

CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門Sho A
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
8分で分かる最近のCakePHP
8分で分かる最近のCakePHP8分で分かる最近のCakePHP
8分で分かる最近のCakePHPMasashi Shinbara
 
Fuel php osc tokyo2012
Fuel php osc tokyo2012Fuel php osc tokyo2012
Fuel php osc tokyo2012Fumito Mizuno
 
Apache 2.4 新機能 “SSL編”
Apache 2.4 新機能 “SSL編”Apache 2.4 新機能 “SSL編”
Apache 2.4 新機能 “SSL編”Ryosuke Yamazaki
 
仮想化した DC を PowerShell で複製する
仮想化した DC を PowerShell で複製する仮想化した DC を PowerShell で複製する
仮想化した DC を PowerShell で複製するjunichi anno
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12kenjis
 
Zend Db Table拡張説明資料
Zend Db Table拡張説明資料Zend Db Table拡張説明資料
Zend Db Table拡張説明資料co-hey japan
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01Yusuke Ando
 
FuelPHPでSentry導入
FuelPHPでSentry導入FuelPHPでSentry導入
FuelPHPでSentry導入fagai
 
CakePHP 1 to 2 Migration tips 100
CakePHP 1 to 2 Migration tips 100CakePHP 1 to 2 Migration tips 100
CakePHP 1 to 2 Migration tips 100ichikaway
 
社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)Iwana Chan
 

Similar to CakePHP 2.x 複数レコード同時保存 (12)

CodeIgniter入門
CodeIgniter入門CodeIgniter入門
CodeIgniter入門
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
8分で分かる最近のCakePHP
8分で分かる最近のCakePHP8分で分かる最近のCakePHP
8分で分かる最近のCakePHP
 
Fuel php osc tokyo2012
Fuel php osc tokyo2012Fuel php osc tokyo2012
Fuel php osc tokyo2012
 
Apache 2.4 新機能 “SSL編”
Apache 2.4 新機能 “SSL編”Apache 2.4 新機能 “SSL編”
Apache 2.4 新機能 “SSL編”
 
仮想化した DC を PowerShell で複製する
仮想化した DC を PowerShell で複製する仮想化した DC を PowerShell で複製する
仮想化した DC を PowerShell で複製する
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
 
Zend Db Table拡張説明資料
Zend Db Table拡張説明資料Zend Db Table拡張説明資料
Zend Db Table拡張説明資料
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
 
FuelPHPでSentry導入
FuelPHPでSentry導入FuelPHPでSentry導入
FuelPHPでSentry導入
 
CakePHP 1 to 2 Migration tips 100
CakePHP 1 to 2 Migration tips 100CakePHP 1 to 2 Migration tips 100
CakePHP 1 to 2 Migration tips 100
 
社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)
 

More from Tomo Mizoe

PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門Tomo Mizoe
 
Git入門 (Windows)
Git入門 (Windows)Git入門 (Windows)
Git入門 (Windows)Tomo Mizoe
 
Visual Studio2013 でGithub(1) セットアップ~同期
Visual Studio2013 でGithub(1) セットアップ~同期Visual Studio2013 でGithub(1) セットアップ~同期
Visual Studio2013 でGithub(1) セットアップ~同期Tomo Mizoe
 
はじめてのASP.NET MVC5
はじめてのASP.NET MVC5はじめてのASP.NET MVC5
はじめてのASP.NET MVC5Tomo Mizoe
 
Unity勉強会資料2014-05-31
Unity勉強会資料2014-05-31Unity勉強会資料2014-05-31
Unity勉強会資料2014-05-31Tomo Mizoe
 
MCP and Microsoft University
MCP and Microsoft UniversityMCP and Microsoft University
MCP and Microsoft UniversityTomo Mizoe
 

More from Tomo Mizoe (6)

PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門
 
Git入門 (Windows)
Git入門 (Windows)Git入門 (Windows)
Git入門 (Windows)
 
Visual Studio2013 でGithub(1) セットアップ~同期
Visual Studio2013 でGithub(1) セットアップ~同期Visual Studio2013 でGithub(1) セットアップ~同期
Visual Studio2013 でGithub(1) セットアップ~同期
 
はじめてのASP.NET MVC5
はじめてのASP.NET MVC5はじめてのASP.NET MVC5
はじめてのASP.NET MVC5
 
Unity勉強会資料2014-05-31
Unity勉強会資料2014-05-31Unity勉強会資料2014-05-31
Unity勉強会資料2014-05-31
 
MCP and Microsoft University
MCP and Microsoft UniversityMCP and Microsoft University
MCP and Microsoft University
 

CakePHP 2.x 複数レコード同時保存

  • 2. 想定するテーブル • Customers • id, created, modified, name(varchar) • Addresses • id, created, modified, address(varchar), customer_id - Customer has many Addresses - Address belongs to Customer
  • 3. Bake直後 レコード保存の流れ: Customer新規作成 → Address追加 これを Customer追加の画面において、複数のAddressを追加できるようにしていく
  • 4. CustomersController.php にメソッドadd_all追加 • add()からコピペして編集 if ($this->Customer->addAll($this->request->data)) { $this->Session->setFlash(__('The customer has been saved.')); return $this->redirect(array('action' => 'index')); } else { $this->Session->setFlash(__('The customer could not be saved. Please, try again.')); } ここだけちょっと変更。モデルのaddAll()を呼び出します。 引数はPOSTでもらったものをそのまま。
  • 5. Model: Customer.php public function addAll($data = null) { if($data == null){ // レコードがなければ return return false; } $result = $this->saveAll($data); // Cusotmer に保存 return true; } モデル間のアソシエーションが定義済みなので、saveAll()を実行すると 実はsaveAssociated() が呼び出される。 saveAssosicated は適切なデータを与えるだけで、いろいろやってくれる。 今回の場合、Customer を追加してその ID を獲得し、Address の customer_id に 割り当てる。もしすべてのレコードが保存できなければ、トランザクションをたどって 保存する前の状態に戻す(DBがトランザクションをサポートしていれば)。 詳細: http://book.cakephp.org/2.0/ja/models/saving-your-data.html
  • 6. View : add_all.ctp <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <script type="text/javascript"> $(function(){ var $i = 1; $('#add_address').click(function(e) { var inputAddress = '<div class="input text required"><label for="Address' + $i + 'Address">Address</label>' + '<input name="data[Address][' + $i + '][address]" maxlength="255" type="text" id="Address' + $i + 'Address" required="required"/></div>' $('#add_address').before(inputAddress); $i++; }); }); </script> <div class="customers form"> <?php echo $this->Form->create('Customer'); ?> <fieldset> <legend><?php echo __('Add Customer with Address'); ?></legend> <?php echo $this->Form->input('name'); echo $this->Form->input('Address.0.address'); ?> <div class="submit" id="add_address"><input type="button" value="住所追加"/></div> </fieldset> <?php echo $this->Form->end(__('実行')); ?> </div> <div class="actions"> <h3><?php echo __('Actions'); ?></h3> <ul> <li><?php echo $this->Html->link(__('顧客一覧'), array('action' => 'index')); ?></li> <li><?php echo $this->Html->link(__('住所一覧'), array('controller' => 'addresses', 'action' => 'index')); ?> </li> <li><?php echo $this->Html->link(__('新しい住所'), array('controller' => 'addresses', 'action' => 'add')); ?> </li> </ul> </div> ボタンを押すと input フィールド追加 Bakeされたadd.ctpとほぼ同じ