QA@IT

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

2979 PV

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

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

$arrayの中
-----------------------------------------
$array = array(
 'id' => 1,
 'name' => '山田 太郎',
 'age' => '20',
 'gender' => '男',
 'address' => '東京都',
 'phone' => '07012345678',
 'emailaddress' => 'hoge@hoge.com',
 .
 .
 .
 .
 .
 .
 .
 .
 .
);
-----------------------------------------

テーブルAのカラム
-----------------------------------------
userid
username
age
sex
add
.
.
.
.
.
.
-----------------------------------------

テーブルBのカラム
-----------------------------------------
id
phone
email
.
.
.
-----------------------------------------

テーブルCのカラム
-----------------------------------------
userid
username
age
sex
add
.
.
.
.
.
.
-----------------------------------------

hogemodel.php(モデル)

public $fieldsA = array(userid, username, age, sex, add);
public $fieldsB = array(id, phone, email);
public $fieldsC = array(userid, username, age, sex, add);

public function hoge($array) {
 //既に登録されていないか確認
  $sql = "SELECT * FROME tableA WHERE tableA.id = :id;";
 $params = array(
  'id'=> $array['id']
 );
 $kakunin = $this->query($sql,$params);

 //テーブルAのデータ
 $dataA['tableA']['userid'] = $array['id'];
 $dataA['tableA']['username'] = $array['name'];
 $dataA['tableA']['age'] = $array['age'];
 .
 .
 .
 .
 .

  //テーブルBのデータ
 $dataB['tableB']['id'] = $array['id'];
 $dataB['tableB']['phone'] = $array['phone'];
 $dataB['tableB']['email'] = $array['emailaddress'];
 .
 .
 .
 .
 .
 $this->Hoge->save($dataA, false, $fieldsA);
 $this->Hoge->save($dataB, false, $fieldsB);

 //既に登録されていた場合、テーブルCにテーブルAの情報を登録
 if(!empty($kakunin)) {
   $dataC['tableC']['userid'] = $kakunin['userid'];
   $dataC['tableC']['username'] = $kakunin['username'];
   $dataC['tableC']['age'] = $kakunin['age'];
   .
   .
   .
   .
   .
  $this->Hoge->save($dataC, false, $fieldsC);
  }
}
ウォッチ

この質問への回答やコメントをメールでお知らせします。