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

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

ただいまの
回答率

88.77%

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

受付中

回答 0

投稿

  • 評価
  • クリップ 2
  • VIEW 876

◆概要
現在、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

<?php
App::uses('AppModel', 'Model');
App::uses('BlowfishPasswordHasher', 'Controller/Component/Auth');
/**
 * User Model
 *
 * @property Follow $Follow
 */
class User extends AppModel {

    public $hasMany = array('Post','Follow');

    public function beforeSave($options = array()) {
        if (isset($this->data[$this->alias]['password'])) {
            $passwordHasher = new BlowfishPasswordHasher();
            $this->data[$this->alias]['password'] = $passwordHasher->hash(
                $this->data[$this->alias]['password']
            );
        }
        return true;
    }

    public $validate = array(
        'username' => array(
            'name_rule1' => array(
                'rule' => array('lengthBetween', 4, 20),
                'required' => true,
                'message' => 'ユーザー名は4〜20文字で入力してください',
             ),
            'name_rule2' => array(
                'rule' => array('alphaNumeric'),
                'message' => 'ユーザー名は文字と数字のみです'
            ),
            'duplicate1' => array(
            'rule' => array('limitDuplicatesUsername'),
            'message' => 'このユーザ名は登録済みです。'
              ),
              'name_rule3' => array(
                'rule' => 'isUnique', 
                'message' => '入力されたユーザー名は既に登録されています'
            ), 
        ),
        'email' => array(
            'email_rule1' => array(
                'rule' => array('lengthBetween', 0, 100),
                'required' => true,
                'message' => 'メールアドレスは最大100文字までです',
             ),
            'email_rule2' => array(
                'rule' => array('email', true),
                'message' => '有効なメールアドレスを入力してください'
            ),
            'duplicate2' => array(
                'rule' => array('limitDuplicatesEmail'),
                'message' => 'このメールアドレスは登録済みです。'
              ),
        ),
        'password' => array(
            'pass_rule1' => array(
                'rule' => array('lengthBetween', 4, 8),
                'required' => true,
                'message' => 'パスワードは4〜8文字で入力してください',
             ),
            'pass_rule2' => array(
                   'rule' => array('custom', '/^[a-zA-Z0-9]+$/'),
                'message' => '文字と数字のみです'
            ),
            'pass_rule3' => array(
                'rule' => 'passwordConfirm', 
                'message' => 'パスワードが一致していません'
            ), 
        ),
        'password_confirm' => array(
            array(
                'rule' => 'notBlank', 
                'message' => 'パスワード(確認)を入力してください'
            ), 
        ),
    );

    public function limitDuplicatesUsername($check) {
        return !$this->findByUsername($check['username']);
      }

      public function limitDuplicatesEmail($check) {
        return !$this->findByEmail($check['email']);
      }

      public function passwordConfirm($check){

        //2つのパスワードフィールドが一致する事を確認する
        if($this->data['User']['password'] === $this->data['User']['password_confirm']){
            return true;
        }else{
            return false;
        }

    }

}

◆コントローラー
UserController.php

public function search() {
        $this->layout = '';
    }

    public function result() {
        $this->layout = '';

        $user = $this->Auth->user();

        if($this->request->is('post')){
        $search_users = $this->request->data['Search']['username'];
        $data = $this->User->find('all',array(
            'conditions'=>array('User.username Like'=>'%'.$search_users.'%')));
            $this->set('search_users',$data);
        }else{ //POST以外の場合
                    //Collectionモデルから全てのデータを検索
            $data = $this->User->find('all');
            //データの連想配列をセット
            $this->set('search_users',$data);
            }
    }

◆ビュー
Users/result.ctp

<!DOCTYPE html>

<head>

</head>
<body>

    <h3>検索結果</h3>

    <table>
        <?php foreach ($search_users as $target_user): ?>
        <tr>
            <td><?php echo $target_user['User']['username'] ?></td>
            <td>
                <?php
                echo $this->Form->create('Follow');
                echo $this->Form->hidden('follow_id',array('value' => $target_user['User']['id']));
                echo $this->Form->hidden('user_id',array('value' => AuthComponent::user('id')));
                echo $this->Form->end('フォロー');
                ?>
            </td>
        </tr>
        <?php endforeach; ?>
        <?php unset($target_user); ?>
    </table>


</body>
</html>

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る