CakePHPで親子テーブルを扱う

CakePHP では hasOne(1対1), hasMany(1対多), belongsTo(多対1), hasAndBelongsToMany(多対多)でModelを結びつけることができる。これは非常に便利な機能のひとつ。これを単純に使う方法はたくさん書かれているが、複数を取り扱うものが少なく感じた。そもそも調べるキーワードがなかなか難しい。

さて、帳票の場合、例えば見積書を作るとすれば、親テーブルと小テーブルを作り、親テーブルには件名や担当、相手社名などが入り、小テーブルは明細行、つまり商品や数量、単価となる。

◆Model

  • 見積書は複数の明細行を持つ
    • 見積 hasMany 明細
  • 見積書は顧客を持つ
    • 見積 belongsTo 顧客
  • 明細は見積に属する
    • 明細 belongsTo 見積

スポンサードリンク

◆View, add.ctp

<?php echo $form->create(‘見積’);?>
 <?php
  echo $form->input(‘顧客_id’);
  echo $form->input(‘件名’);
  for($i=0;$i<9;$i++){
   echo $form->input(‘明細.’ . $i . ‘.品名’);
   echo $form->input(‘明細.’ . $i . ‘.単価’);
   echo $form->input(‘明細.’ . $i . ‘.数量’);
  }

 ?>
<?php echo $form->end(‘Submit’);?> 

◆Controller, 見積_controller.php

 function add() {
  if (!empty($this->data)) {
   $this->見積->create();
   if(!$this->見積->saveAll($this->data)===false) {
    $this->Session->setFlash(__(‘The 見積 has been saved’, true));
    $this->redirect(array(‘action’=>’index’));
   } else {
    $this->Session->setFlash(__(‘The 見積 could not be saved. Please, try again.’, true));
   }
  }
  $customers = $this->見積->Customer->find(‘list’);
  $this->set(compact(‘customers’));
 }

※実際にはコード中に日本語を使用していない
※Ajaxを使わなない場合の例
※’dependent’ => true,を見積Modelの明細定義に指定すると、見積を削除した際に明細も削除できる
※これはサンプルなので完全な動作はしない

参考文献

  • 関連: モデルを結びつける :: モデル :: CakePHPによる開発 :: マニュアル :: 1.2 Collection :: The Cookbook :
    http://book.cakephp.org/ja/view/78/Associations-Linking-Models-Together
  • CakePHP 1.2 の saveAll その2 | Sun Limited Mt. :
    http://www.syuhari.jp/blog/archives/170
  • CakePHPの基礎(1ページで複数モデル)|HyDev ~クソオヤジの戯言~#main#main :
    http://ameblo.jp/hyperdev/entry-10352507176.html#main
  • CakePHPの基礎(1ページで複数モデル)2|HyDev ~クソオヤジの戯言~#main#main :
    http://ameblo.jp/hyperdev/entry-10352630349.html#main
  • CakePHPの基礎(1ページで複数モデル)3|HyDev ~クソオヤジの戯言~#main#main :
    http://ameblo.jp/hyperdev/entry-10352706817.html#main
  • CakePHPの基礎(1ページで複数モデル)4|HyDev ~クソオヤジの戯言~ :
    http://ameblo.jp/hyperdev/entry-10353165425.html

関連記事

スポンサードリンク

Comments

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です