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

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

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

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

CakePHP

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

Q&A

0回答

293閲覧

CakePHPでのフォロー機能実装処理

ULAS_J1120_0641

総合スコア13

PHP

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

CakePHP

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

0グッド

2クリップ

投稿2019/05/01 01:41

◆概要
現在、CakePHP2.XでSNSのフォロー機能を実装していますが、
フォロー機能の仕組みがいまいち理解できていません。
ユーザー検索結果でユーザーとフォローボタンを表示して、フォローします。
フォローはfollowsテーブルのuser_idとfollow_idにフォームにて記録できれば
実現できると考えております。
そのフォローボタンのフォームでuser_idとfollow_idがうまくFollowsテーブルに格納できずに悩んでいます。

◆テーブル
・users
・follows
・posts

usersには、id,usernameがあり、
followsには、user_id,follow_idを設けています。

フォロー状態を記録するには、followsにuser_idとfollow_idを記録できれば良いと思っています。

◆モデル
User.php

cakePHP2

1<?php 2App::uses('AppModel', 'Model'); 3App::uses('BlowfishPasswordHasher', 'Controller/Component/Auth'); 4/** 5 * User Model 6 * 7 * @property Follow $Follow 8 */ 9class User extends AppModel { 10 11 public $hasMany = array('Post','Follow'); 12 13 public function beforeSave($options = array()) { 14 if (isset($this->data[$this->alias]['password'])) { 15 $passwordHasher = new BlowfishPasswordHasher(); 16 $this->data[$this->alias]['password'] = $passwordHasher->hash( 17 $this->data[$this->alias]['password'] 18 ); 19 } 20 return true; 21 } 22 23 public $validate = array( 24 'username' => array( 25 'name_rule1' => array( 26 'rule' => array('lengthBetween', 4, 20), 27 'required' => true, 28 'message' => 'ユーザー名は4〜20文字で入力してください', 29 ), 30 'name_rule2' => array( 31 'rule' => array('alphaNumeric'), 32 'message' => 'ユーザー名は文字と数字のみです' 33 ), 34 'duplicate1' => array( 35 'rule' => array('limitDuplicatesUsername'), 36 'message' => 'このユーザ名は登録済みです。' 37 ), 38 'name_rule3' => array( 39 'rule' => 'isUnique', 40 'message' => '入力されたユーザー名は既に登録されています' 41 ), 42 ), 43 'email' => array( 44 'email_rule1' => array( 45 'rule' => array('lengthBetween', 0, 100), 46 'required' => true, 47 'message' => 'メールアドレスは最大100文字までです', 48 ), 49 'email_rule2' => array( 50 'rule' => array('email', true), 51 'message' => '有効なメールアドレスを入力してください' 52 ), 53 'duplicate2' => array( 54 'rule' => array('limitDuplicatesEmail'), 55 'message' => 'このメールアドレスは登録済みです。' 56 ), 57 ), 58 'password' => array( 59 'pass_rule1' => array( 60 'rule' => array('lengthBetween', 4, 8), 61 'required' => true, 62 'message' => 'パスワードは4〜8文字で入力してください', 63 ), 64 'pass_rule2' => array( 65 'rule' => array('custom', '/^[a-zA-Z0-9]+$/'), 66 'message' => '文字と数字のみです' 67 ), 68 'pass_rule3' => array( 69 'rule' => 'passwordConfirm', 70 'message' => 'パスワードが一致していません' 71 ), 72 ), 73 'password_confirm' => array( 74 array( 75 'rule' => 'notBlank', 76 'message' => 'パスワード(確認)を入力してください' 77 ), 78 ), 79 ); 80 81 public function limitDuplicatesUsername($check) { 82 return !$this->findByUsername($check['username']); 83 } 84 85 public function limitDuplicatesEmail($check) { 86 return !$this->findByEmail($check['email']); 87 } 88 89 public function passwordConfirm($check){ 90 91 //2つのパスワードフィールドが一致する事を確認する 92 if($this->data['User']['password'] === $this->data['User']['password_confirm']){ 93 return true; 94 }else{ 95 return false; 96 } 97 98 } 99 100}

◆コントローラー
UserController.php

CakePHP2

1 2public function search() { 3 $this->layout = ''; 4 } 5 6 public function result() { 7 $this->layout = ''; 8 9 $user = $this->Auth->user(); 10 11 if($this->request->is('post')){ 12 $search_users = $this->request->data['Search']['username']; 13 $data = $this->User->find('all',array( 14 'conditions'=>array('User.username Like'=>'%'.$search_users.'%'))); 15 $this->set('search_users',$data); 16 }else{ //POST以外の場合 17 //Collectionモデルから全てのデータを検索 18 $data = $this->User->find('all'); 19 //データの連想配列をセット 20 $this->set('search_users',$data); 21 } 22 }

◆ビュー
Users/result.ctp

CakePHP2

1<!DOCTYPE html> 2 3<head> 4 5</head> 6<body> 7 8 <h3>検索結果</h3> 9 10 <table> 11 <?php foreach ($search_users as $target_user): ?> 12 <tr> 13 <td><?php echo $target_user['User']['username'] ?></td> 14 <td> 15 <?php 16 echo $this->Form->create('Follow'); 17 echo $this->Form->hidden('follow_id',array('value' => $target_user['User']['id'])); 18 echo $this->Form->hidden('user_id',array('value' => AuthComponent::user('id'))); 19 echo $this->Form->end('フォロー'); 20 ?> 21 </td> 22 </tr> 23 <?php endforeach; ?> 24 <?php unset($target_user); ?> 25 </table> 26 27 28</body> 29</html>

思うところとしては、モデルを連携するアソシエーションなんかが必要なのかな、と思っていますが、うまくできませんでした。
Followsのモデルやコントローラー、ビューに関してはファイルは作成していますが特に記述をしていません。
以上の情報で足りてるかわかりませんが、ご存知のことがあればご教示いただけると幸いです。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問