質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

1837閲覧

cakephp1.3のsaveAllでアソシエーションの無いテーブルを同時保存するには

sleepsheep

総合スコア310

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2016/11/14 15:31

###前提・実現したいこと
以下のようなテーブルがあり、parentTableからchildTable1とchildTable2にはhasOneのアソシエーションで親子関係が定義されています。
childTable1とchildTable2は親テーブル(parentTable)のidを持っていますが、双方のidは持っていません。

SQL

1create table parentTable { 2 id serial primary key, 3 created datetime, 4 modified datetime, ... 5} 6create table childTable1 { 7 id serial primary key, 8 created datetime, 9 modified datetime, 10 parentTable_id int(10), ... 11} 12create table childTable2 { 13 id serial primary key, 14 created datetime, 15 modified datetime, 16 parentTable_id int(10), ... 17}

cakephp1.3のシステムで、childTable1とchildTable2のデータをそれぞれ個別に登録する画面を作成していました。
今回、それらの登録画面を統合し、1つの画面から2つのテーブルのデータを登録するような改修を行うことになりました。
データ更新したテーブルのみmodifiedを更新するため、親テーブルは更新対象としていません。

###発生している問題
これら2つのテーブルに1トランザクションでデータを登録したく、saveAll()を使おうとしたのですが、両方のデータを同時に更新する方法が分かりません。

###試したこと
以下のようにデータを作成してchildTable1モデルのsaveAll()を呼び出したとき、childTable1のデータだけしか更新されませんでした。

$data = array( ['childTable1'] => array( ['id'] => 1 ...) ['childTable2'] => array( ['id'] => 1 ...) ); $this->childTable1->saveAll($data);

アソシエーションの無いテーブルを同時に更新するにはどうすればよいでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

もうCakephp1.3の環境がないので検証していませんが...
以下のように親テーブルを使って保存した場合、子テーブルだけでも保存できそうな気がしますが、うまくいかないのでしょうか

php

1$this->parentTable->saveAll($data);

それができない場合、明示的にトランザクションの開始やコミットを宣言すれば対応できると思いますよ

php

1$dataSource = $this->childTable1->getDataSource(); 2$dataSource->begin($this); 3 4$this->childTable1->save($data); 5$this->childTable2->save($data); 6 7if(/*全部うまくいったら*/) { 8 $dataSource->commit($this); 9} else { 10 $dataSource->rollback($this); 11}

投稿2016/11/14 20:32

編集2016/11/14 20:33
popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sleepsheep

2016/11/15 02:52

親テーブルのモデルでsaveAll()を使った場合、親テーブルへのinsert文が発行されているようでした。 トランザクションを宣言して、それぞれの子テーブルに個別に保存する方法で対応したいと思います。 回答いただきありがとうございました。
popobot

2016/11/15 02:53

> 親テーブルのモデルでsaveAll()を使った場合、親テーブルへのinsert文が発行されているようでした。 試していただいてありがとうございます...だめでしたかすみません。 なるほど、そうなるんですね... 勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問