前提・実現したいこと
PHP(CakePHP)で1つの入力フォームから2つのテーブルにエンティティを保存するシステム作っています。
CookBookを参考にpatchEntity()でassociatedオプションを使えばできるとのことでしたがうまくいきません。
発生している問題・エラーメッセージ
エラーメッセージは出ませんが、Aテーブルにはレコードが保存されるがBテーブルには保存されません。
該当のソースコード
テーブル構造
php
1ATable 2id|int(10) unsigned auto_increment|primary_key 3device_no|varchar(10) 4device_bit_no|tinyint(4) 5report_item_name|varchar(50) 6decimal_point|tinyint(4) 7display_unit|varchar(10) 8print_position_p|decimal(9,3) 9print_position_x|decimal(9,3) 10print_position_y|decimal(9,3) 11 12BTable 13id|int(10) unsigned auto_increment|primary_key 14device_no|varchar(10) 15device_bit_no|tinyint(4) 16base_valueF|decimal(12,3) 17base_valueT|decimal(12,3)
ATable.php
php
1 public function initialize(array $config) 2 { 3 parent::initialize($config); 4 5 $this->setTable('a'); 6 $this->setDisplayField('id'); 7 $this->setPrimaryKey('id'); 8 9 $this->addBehavior('Timestamp'); 10 11 $this->hasOne('B', [ 12 'foreignKey' => ['device_no', 'device_bit_no'], 13 'bindingKey' => ['device_no', 'device_bit_no'], 14 'joinType' => 'INNER' 15 ]); 16 } 17
BTable.php
php
1 public function initialize(array $config) 2 { 3 parent::initialize($config); 4 5 $this->setTable('b'); 6 $this->setDisplayField('id'); 7 $this->setPrimaryKey('id'); 8 9 $this->addBehavior('Timestamp'); 10 11 $this->belongsTo('A', [ 12 'foreignKey' => ['device_no', 'device_bit_no'], 13 'bindingKey' => ['device_no', 'device_bit_no'], 14 'joinType' => 'INNER' 15 ]); 16 17 } 18
AController.php
php
1public function add() 2 { 3 $this->loadModel('B'); 4 $a = $this->A->newEntity(['associated'=>['B']]); 5 if ($this->request->is('post','put')) { 6 $data = $this->request->getData(); 7 $a = $this->A->patchEntity($a, $data, ['associated'=>['B']]); 8 if ($this->A->save($a)) { 9 $this->Flash->success(__('登録に成功しました')); 10 11 return $this->redirect(['action' => 'index']); 12 } 13 $this->Flash->error(__('登録に失敗しました')); 14 } 15 $this->set(compact('a')); 16 }
add.ctp
php
1<script> 2 3function save(){ 4 document.MainForm.submit(); 5} 6 7</script> 8 9<div class="box_page_bg"> 10 <div class="box_main"> 11 <?php echo $this->Form->create($a, ['name'=>'MainForm', 'templates'=>'input_template']); ?> 12 <div class="box_main_table"> 13 <table> 14 <tbody id="categories"> 15 <tr> 16 <td>デバイス番号</td> 17 <td><?php echo $this->Form->control('device_no'); ?></td> 18 </tr> 19 <tr> 20 <td>デバイスビット番号</td> 21 <td><?php echo $this->Form->control('device_bit_no'); ?></td> 22 </tr> 23 <tr> 24 <td>帳票項目名称</td> 25 <td><?php echo $this->Form->control('report_item_name'); ?></td> 26 </tr> 27 <tr> 28 <td>小数点</td> 29 <td><?php echo $this->Form->control('decimal_point'); ?></td> 30 </tr> 31 <tr> 32 <td>表示単位</td> 33 <td><?php echo $this->Form->control('display_unit'); ?></td> 34 </tr> 35 <tr> 36 <td>基準値To</td> 37 <td><?php 38 $value = $a['b.base_valueT']; 39 $finalval = number_format((float)$value, 3); 40 echo $this->Form->control('b.base_valueT',['value'=>$finalval]); 41 ?></td> 42 </tr> 43 <tr> 44 <td>基準値From</td> 45 <td><?php 46 $value = $a['b.base_valueF']; 47 $finalval = number_format((float)$value, 3); 48 echo $this->Form->control('b.base_valueF',['value'=>$finalval]); 49 ?></td> 50 </tr> 51 <tr> 52 <td>印刷位置ページ</td> 53 <td><?php echo $this->Form->control('print_position_p'); ?></td> 54 </tr> 55 <tr> 56 <td>印刷位置X</td> 57 <td><?php echo $this->Form->control('print_position_x'); ?></td> 58 </tr> 59 <tr> 60 <td>印刷位置Y</td> 61 <td><?php echo $this->Form->control('print_position_y'); ?></td> 62 </tr> 63 </tbody> 64 </table> 65 </div> 66 <div class="clearfix"> 67 <div class="float_l"> 68 <a href="<?php echo SITE_URL;?>/<?php echo $controller?>/index" class="btn min color4">キャンセル</a> 69 <a href="javascript:void(0)" class="btn min color2" onclick="save()">保存</a> 70 </div> 71 </div> 72</div> 73
試したこと・気づいたこと
・print_rで変数の内容を確認
・フォームから送られたdataはBの配列を含む複合配列だった。
・patchEntity()を実行するとBの配列が消える。
$data(patchEntity前)
Array ( [device_no] => test [device_bit_no] => 0 [report_item_name] => test [decimal_point] => 0 [display_unit] => test [b] => Array ( [base_valueT] => 100.000 [base_valueF] => 10.000 [judgment_id] => 4 ) [print_position_p] => 1 [print_position_x] => 1 [print_position_y] => 1 [create_user] => 2 [modified_user] => 2 )
$a(patchEntity後)
App\Model\Entity\A Object ( [device_no] => test [device_bit_no] => 0 [report_item_name] => test [decimal_point] => 0 [display_unit] => test [print_position_p] => 1 [print_position_x] => 1 [print_position_y] => 1 [create_user] => 2 [modified_user] => 2 [[new]] => 1 [[accessible]] => Array ( [device_no] => 1 [device_bit_no] => 1 [report_item_name] => 1 [decimal_point] => 1 [display_unit] => 1 [print_position_p] => 1 [print_position_x] => 1 [print_position_y] => 1 [delete_flg] => 1 [create_user] => 1 [created] => 1 [modified_user] => 1 [modified] => 1 )
補足情報(FW/ツールのバージョンなど)
外部キーはdevice_noとdevice_bit_noの2つを使ってつなぐように言われたんですがそもそもそんなアソシエーション組めるのでしょうか?
回答1件
あなたの回答
tips
プレビュー