2013-05-15 56 views
1

想要在我的網站上獲得我所有的友好活動。Yii:與3張表的內連接

我有3個表:

  • follow_users(user_idfollow_user_id
  • 視頻(IDTitleDateLikesViewsActiveusers_id
  • videos_has_userlikes(idisLikedusers_idvideos_id

現在,我想創建查詢來獲取所有這樣的朋友在登錄用戶的活動

事情是這樣的:

$followers = Select * from follow_users where user_id = $MyId; 

foreach ($followers as $userFollow) { 

Select * from videos innerjoin videos_has_userlikes on videos.ID = videos_has_userlikes.videos_id where videos_has_userlikes.users_id = $userFollow; 
} 

我在Yii的功能試過,但我不知道如何使用innerjoin有3個表..

public function getFriendsLikeActivity($userId){ 
     $criteria = new CDbCriteria; 
     $criteria->select = '*'; 
     $criteria->alias = 'videos, videos_has_userlikes, follow_users'; 
     $criteria->join = 'INNER JOIN videos_has_userlikes ON videos.ID = videos_has_userlikes.videos_id INNER JOIN follow_users ON videos.users_id = follow_users.user_id'; 
     $criteria->condition = 'follow_users.user_id =:usersID AND videos.users_id = :usersID AND Active=:active AND videos_has_userlikes.isLiked =:liked'; 
     $criteria->params = array(
      ':usersID' => $userId, 
      ':active' => TRUE, 
      ':liked' => TRUE, 
     ); 
     $criteria->order = 'videos_has_userlikes.date Desc';   

     return Videos::model()->with('users')->findAll($criteria); 
    } 

請一些幫助:)

謝謝!

謝謝@deez!

但我只想說我按照用戶的樣活性..

現在我取人從VideosHasUserLikes表中的數據,但沒有表followUser的關係。用戶表和followUser表之間只有關係。有沒有辦法用$ criteria-> with()加入這些表格?

現在我有這樣的代碼,但因爲沒有關係「followUser」表我得到一個錯誤..

public function getFriendsLikeActivity($userId){ 
     $criteria = new CDbCriteria; 
     $criteria->select = '*'; 
     $criteria->alias = 'videos_has_userlikes';  
     $criteria->condition = 'videos.users_id = :usersID AND Active=:active AND videos_has_userlikes.isLiked =:liked'; 
     $criteria->params = array(
      ':usersID' => $userId, 
      ':active' => TRUE, 
      ':liked' => TRUE, 
     ); 
     $criteria->with = array(
      'videos'=>array(
       'together'=>true, 
       'select'=>'*',     
      ), 
      'users'=>array(
       'together'=>true, 
       'select'=>'*', 
      ), 
      'followUser'=>array(
       'together'=>true, 
       'select'=>'*', 
      ), 
     );  

     return VideosHasUserLikes::model()->findAll($criteria); 
    } 

也許類似的東西?

public function getFriendsLikeActivity($userId){ 
      $criteria = new CDbCriteria; 
      $criteria->select = '*'; 
      $criteria->alias = 'videos_has_userlikes';  
      $criteria->condition = 'videos.users_id = :usersID AND Active=:active AND videos_has_userlikes.isLiked =:liked'; 
      $criteria->params = array(
       ':usersID' => $userId, 
       ':active' => TRUE, 
       ':liked' => TRUE, 
      ); 
      $criteria->with = array(
       'videos'=>array(
        'together'=>true, 
        'select'=>'*',     
       ), 
       'users'=>array(
        'together'=>true, 
        'select'=>'*', 
        'with' => 'followUser'=>array(
            'together'=>true, 
            'select'=>'*'), 
      ), 

       ),     
      );  

      return VideosHasUserLikes::model()->findAll($criteria); 
     } 

謝謝!

回答

1

你應該考慮使用CDbCriteria-> with。

$criteria->with = array(
    'videos'=>array(
     'together'=>true, 
     'select'=>'field1, field2, field3', 
    ), 
    'videos.likes'=>array(
     'together'=>true, 
     'select'=>'field1, field2, field3', 
    ),   
); 

然後,您可以像$ model-> videos-> field1或$ model-> videos-> likes-> field1那樣引用它。

http://www.yiiframework.com/doc/api/1.1/CDbCriteria#with-detail

編輯:

你應該表現出你對更多的幫助關係,但我想你想要的是從用戶HAS_MANY關係成立user_likes,然後將其包含在用。

+0

謝謝!我的查詢看起來是這樣的..但我不知道如何寫他在Yii - >從視頻中選擇* JOIN videos_has_userlikes ON videos.ID = videos_has_userlikes.videos_id WHERE active = true AND videos_has_userlikes。users_id IN(SELECT follow_user_id FROM follow_users JOIN users on follow_users.user_id = users.id WHERE user_id = 1 AND isliked = true); – user2381153