CakePHP - 如何获取用户在Twitter Clone中关注的人的帖子?

时间:2012-07-06 02:46:43

标签: php mysql cakephp twitter has-and-belongs-to-many

我正在尝试使用CakePHP构建Twitter克隆。我在我的模型之间建立了HABTM关系(如果我做得不对,我不是100%确定)。 我的数据库中有3个表:

  1. 用户(ID,用户名,密码)
  2. 推文(id,tweet_msg,user_id,已创建)
  3. relationship(id,user_id,follower_id)
  4. 我的模型设置如下:

    用户模型:

    <?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');但是我不知道我是否采取了正确的方式。谁能告诉我如何获取用户所关注的人的推文? 这将不胜感激, 谢谢。

1 个答案:

答案 0 :(得分: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)