0

CakePHPでTwitterクローンを作成しようとしています。モデル間にHABTM関係を設定しています(これを正しく行ったかどうかは100%わかりません)。データベースに3つのテーブルがあります。

  1. ユーザー(ID、ユーザー名、パスワード)
  2. ツイート(id、tweet_msg、user_id、作成済み)
  3. 関係(id、user_id、follower_id)

私のモデルは次のように設定されています。

ユーザーモデル:

<?php

  class User extends AppModel {
    var $name = 'User';
    var $hasMany = 'Tweet';
    var $hasAndBelongsToMany = array(
            'Follower' => array(
                  'className'             => 'Follower',
                  'joinTable'             => 'relationships',
                  'foreignKey'            => 'user_id',
                  'associationForeignKey' => 'follower_id'
            )
      );

ツイートモデル:

<?php

class Tweet extends AppModel {

     public $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id',
            'conditions' => '',
            'fields' => '',
            'order' => 'Tweet.created DESC'
        )
    );

}

フォロワーモデル:

<?php

class Follower extends AppModel{
      var $name     = 'Follower';
      var $useTable = 'users';
}

HABTMアソシエーションが正しく設定されていると仮定して、ユーザーがフォローしているユーザーのツイートを取得しようとしていますが、クエリがどのように表示されるかわかりません。私はこれを行うためにいくつかの方法を試しましたが、どれもうまくいきませんでした。ユーザーのフォローしているIDを取得する方法がわからないと思います。私は次のようなことを試みました:$this->User->Follower->find('list');しかし、私は正しい方向に進んでいるかどうかわかりません。ユーザーがフォローしている人のツイートを取得する方法を教えてもらえますか?よろしくお願いします、ありがとうございます。

4

1 に答える 1

1

ユーザーモデルは次のように設定する必要があります。

<?php

class User extends AppModel {
    public $name = 'User';

    public $actsAs = array('Containable');

    public $hasMany = array(
        'Tweet'
    );

    public $hasAndBelongsToMany = array(
        'Follower' =>
            array(
                'className'             => 'User',
                'joinTable'             => 'relationships',
                'foreignKey'            => 'user_id',
                'associationForeignKey' => 'follower_id'
            )
    );

}

このようにすると、追加のフォロワーモデルが不要になります。次に、コントローラーで次のようなものを試してください。

public function followerTweets($userid) {
    $this->set('user',
        $this->User->find('all', array(
        'contain' => array(
             'Follower' => array(
                  'Tweet'
              )
        ),
        'conditions' => array(
            'User.id' => $userid
        )
    )));
}

次に、次のようなビューで、指定したユーザーのフォロワーのツイートをループできます。

<?php
$tweets = array();
foreach ($players['0']['Follower'] as $follower):
$tweets = array_merge($follower['Tweet'], $tweets);
endforeach;
?>

これにより、次のような配列が残ります。

var_dump($tweets)

array
  0 => 
    array
      'id' => string '5' (length=1)
      'user_id' => string '5' (length=1)
  1 => 
    array
      'id' => string '20' (length=2)
      'user_id' => string '5' (length=1)
  2 => 
    array
      'id' => string '6' (length=1)
      'user_id' => string '4' (length=1)
  3 => 
    array
      'id' => string '7' (length=1)
      'user_id' => string '4' (length=1)
  4 => 
    array
      'id' => string '8' (length=1)
      'user_id' => string '4' (length=1)
  5 => 
    array
      'id' => string '21' (length=2)
      'user_id' => string '4' (length=1)
  6 => 
    array
      'id' => string '22' (length=2)
      'user_id' => string '4' (length=1)
  7 => 
    array
      'id' => string '23' (length=2)
      'user_id' => string '4' (length=1)
  8 => 
    array
      'id' => string '3' (length=1)
      'user_id' => string '2' (length=1)
  9 => 
    array
      'id' => string '11' (length=2)
      'user_id' => string '2' (length=1)
  10 => 
    array
      'id' => string '18' (length=2)
      'user_id' => string '2' (length=1)
  11 => 
    array
      'id' => string '26' (length=2)
      'user_id' => string '2' (length=1)
于 2012-07-06T10:21:48.020 に答える