CakePHPのブログチュートリアルの延長で、一度記述したらあまり変更のないユーザー情報と頻繁に変更がある情報を分割しようと思い、アソシエーション機能で試行錯誤しているのですが上手くいきません。
画像のAction部分の「追加」「削除」でユーザーのお気に入り記事のチェックを付けたり外したりできるようにしました。
「追加」のアクションchoice、「削除」のアクションnot_choiceのコードは以下の通りです。
PHP
1/app/Controller/PostsController.php 2class PostsController extends AppController { 3/// 4 5public function choice($id) { 6 if ($this->request->is('post')){ 7 $cond = $this->Auth->user('id'); 8 $user = $this->User->findByid($cond); 9 $data = $user['User']['choiced']; 10 $ch_spo = explode(',', $data); 11 $ch_spo = array_filter($ch_spo); 12 if(!in_array("$id", $ch_spo)){ 13 array_push($ch_spo, "$id"); 14 }; 15 $data = implode(',', $ch_spo); 16 $this->User->id = $this->Auth->user('id'); 17 $this->User->saveField('choiced', "$data"); 18 } 19 return $this->redirect(array('action' => 'index')); 20 } 21 22 public function not_choice($id) { 23 if ($this->request->is('post')){ 24 $cond = $this->Auth->user('id'); 25 $user = $this->User->findByid($cond); 26 $data = $user['User']['choiced']; 27 $ch_spo = explode(',', $data); 28 $ch_spo = array_filter($ch_spo); 29 if(in_array("$id", $ch_spo)){ 30 $del_id = array_search("$id", $ch_spo); 31 unset($ch_spo["$del_id"]); 32 }; 33 $data = implode(',', $ch_spo); 34 $this->User->id = $this->Auth->user('id'); 35 $this->User->saveField('choiced', "$data"); 36 } 37 return $this->redirect(array('action' => 'index')); 38 } 39}
結局何をしているかというと、記事のidをuserテーブルのchoicedカラムに保存しているだけです。
現在、choicedをuserテーブルと切り離し、新たにuser_detailテーブルに入れてこっちに書き込んでいこうとしているところです。
現在の一番の問題は、ユーザー登録した時点でuserテーブルだけでなくuser_detailテーブルにもレコードを作っておきたいのですが、出来ません。
userテーブルとuser_detailテーブルは以下の画像の通りです。
userが親でuser_detailが子のイメージだと思うのでuser_detail側にuser_idを入れています。
アソシエーションの設定を以下のようにしています。
php
1// app/Model/User.php 2class User extends AppModel { 3public $hasOne = 'User_detail'; 4} 5 6// app/Model/User_detail.php 7class User_detail extends AppModel { 8public $belongsTo = 'User'; 9}
外部キーは規約に沿っていると思うので、これだけでいいはずだと考えています。
会員登録時にuser_detailにもレコードの保存ができるようにするには、以下の会員登録ページのビューとアクションのコードをどのように変更すればいいのでしょうか?
PHP
1// app/Controller/UsersController.php 2class UsersController extends AppController { 3public function add() { 4 if ($this->request->is('post')) { 5 $this->User->create(); 6 if ($this->User->save($this->request->data)) { 7 $this->Flash->success(__('The user has been saved')); 8 return $this->redirect(array('action' => 'index')); 9 } 10 $this->Flash->error( 11 __('The user could not be saved. Please, try again.') 12 ); 13 } 14 } 15}
html
1<!-- app/View/Users/add.ctp --> 2<div class="users form"> 3<?php echo $this->Form->create('User'); ?> 4 <fieldset> 5 <legend><?php echo __('Add User'); ?></legend> 6 <?php echo $this->Form->input('username'); 7 echo $this->Form->input('password'); 8 echo $this->Form->input('role', array( 9 'options' => array('admin' => 'Admin', 'author' => 'Author') 10 )); 11 ?> 12 </fieldset> 13<?php echo $this->Form->end(__('Submit')); ?> 14</div>
複雑な説明になってわかりにくい説明になったかもしれませんが、出来るだけ詳しい説明をよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/14 15:15
2016/03/16 15:25