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

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

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

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

Q&A

解決済

2回答

5858閲覧

CakePHPのModelで複数のテーブルにデータを保存する方法。

teraemon

総合スコア14

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

0グッド

1クリップ

投稿2015/11/09 08:55

CakePHPのModelで複数のテーブルにデータを保存したいのですがどうしてもコードが長くなってしまいます。
もっと簡潔な方法があれば教えてください。

やりたいこととしては下記になります。
会員登録フォームで会員情報を入力して送信ボタンを押下するとModelのhoge()というメソッドが呼ばれます。
そこで引数として渡されたデータをテーブルA テーブルBにデータ登録や更新をします。(※既に登録済みの場合、更新する。)
更新の場合はテーブルAの情報を更新前にテーブルCにデータ登録します。

php

1$arrayの中 2----------------------------------------- 3$array = array( 4 'id' => 1, 5 'name' => '山田 太郎', 6 'age' => '20', 7 'gender' => '男', 8 'address' => '東京都', 9 'phone' => '07012345678', 10 'emailaddress' => 'hoge@hoge.com', 11 . 12 . 13 . 14 . 15 . 16 . 17 . 18 . 19 . 20); 21----------------------------------------- 22 23テーブルAのカラム 24----------------------------------------- 25userid 26username 27age 28sex 29add 30. 31. 32. 33. 34. 35. 36----------------------------------------- 37 38テーブルBのカラム 39----------------------------------------- 40id 41phone 42email 43. 44. 45. 46----------------------------------------- 47 48テーブルCのカラム 49----------------------------------------- 50userid 51username 52age 53sex 54add 55. 56. 57. 58. 59. 60. 61----------------------------------------- 62 63hogemodel.php(モデル) 64 65public $fieldsA = array(userid, username, age, sex, add); 66public $fieldsB = array(id, phone, email); 67public $fieldsC = array(userid, username, age, sex, add); 68 69public function hoge($array) { 70 //既に登録されていないか確認 71 $sql = "SELECT * FROME tableA WHERE tableA.id = :id;"; 72 $params = array( 73 'id'=> $array['id'] 74 ); 75 $kakunin = $this->query($sql,$params); 76 77 //テーブルAのデータ 78 $dataA['tableA']['userid'] = $array['id']; 79 $dataA['tableA']['username'] = $array['name']; 80 $dataA['tableA']['age'] = $array['age']; 81 . 82 . 83 . 84 . 85 . 86 87 //テーブルBのデータ 88 $dataB['tableB']['id'] = $array['id']; 89 $dataB['tableB']['phone'] = $array['phone']; 90 $dataB['tableB']['email'] = $array['emailaddress']; 91 . 92 . 93 . 94 . 95 . 96 $this->Hoge->save($dataA, false, $fieldsA); 97 $this->Hoge->save($dataB, false, $fieldsB); 98 99 //既に登録されていた場合、テーブルCにテーブルAの情報を登録 100 if(!empty($kakunin)) { 101 $dataC['tableC']['userid'] = $kakunin['userid']; 102 $dataC['tableC']['username'] = $kakunin['username']; 103 $dataC['tableC']['age'] = $kakunin['age']; 104 . 105 . 106 . 107 . 108 . 109 $this->Hoge->save($dataC, false, $fieldsC); 110 } 111}

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

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

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

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

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

guest

回答2

0

ベストアンサー

Cakeのテクニックとはと全く関係ないですが、コードを短くする、という点で・・・

php

1<?php 2... 3public function hoge($array) 4{ 5 //既に登録されていないか確認 6 $sql = "SELECT * FROME tableA WHERE tableA.id = :id"; 7 $params = array( 'id'=> $array['id'] ); 8 $kakunin = $this->query($sql,$params); 9 //テーブルAのデータ 10 $this->__array_copy($array, $dataA['tableA'], array('id', 'name', 'age')); 11 //テーブルBのデータ 12 $this->__array_copy($array, $dataB['tableB'], array('id', 'phone', 'emailaddress')); 13 $this->Hoge->save($dataA, false, $fieldsA); 14 $this->Hoge->save($dataB, false, $fieldsB); 15 //既に登録されていた場合、テーブルCにテーブルAの情報を登録 16 if(!empty($kakunin)) { 17 $this->__array_copy($array, $dataC['tableC'], array('userid', 'username', 'age')); 18 $this->Hoge->save($dataC, false, $fieldsC); 19 } 20} 21 22private function __array_copy($from, &$to, $keys) 23{ 24 foreach ($keys as $key) 25 $to[$key] = $from[$key]; 26}

あ、$dataXのコピーと$fieldsXへの登録はセットみたいなので、 $this->__array_copy()$this->Hoge->save()を行うメソッドを用意して、それをA、B、Cそれぞれのデータ保存時に呼ぶようにすれば、もっと短くなりますね。

投稿2015/12/17 15:11

hernia_orz

総合スコア58

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

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

0

ペストアンサーに選ばせて頂いた内容で解決しました。
ありがとうございました!

投稿2017/05/17 08:08

teraemon

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問