0

我正在尝试使用内部连接和条件从数据库中获取数据。我想拥有用户和视频的结果。

现在我正在使用createCommand:

public function getRelatedByUser($users_id){

      $videos = Yii::app()->db->createCommand()
                        ->select('*')
                        ->from('videos')
                        ->join('users', 'videos.users_id = users.id')
                        ->where('videos.users_id = :userId AND Active=:active'
                        , array(':userId' => $users_id, ':active' => TRUE))                        
                        ->order('Date desc')
                        ->limit(5)
                        ->queryAll();

                return $videos;
       }

但我想将命令与 yii 模型一起使用,例如:

public function getRelatedByUser($users_id){

               $criteria=new CDbCriteria;  
               $criteria->select = '*';
               $criteria->alias = 'videos';
               $criteria->join = 'INNER JOIN users ON videos.users_id = users.id';
               $criteria->condition = 'users.id = :userID AND Active=:active';
               $criteria->params = array (
                   ':userID' => $users_id,
                   ':active' => TRUE,
               );                
               return Videos::model()->findAll($criteria);
       }

但问题是,当我使用上面的代码时,我只得到 Videos 的值,因为我使用 Videos::model()...

现在我想知道是否可以使用多个模型,例如:

return VideosAndUsers::model()->findAll($criteria); 或者

return All::model()->findAll($criteria);
4

2 回答 2

2

在您的Videos模型中创建/编辑方法

public function relations() {
    return array(
        'user' => array(self::BELONGS_TO, 'Users', 'users_id')
    );
}

(顺便说一句,命名列的正确方法是user_id而不是users_id

然后你可以通过

Videos::model()->with('user')->findAllByAttributes(
    array('users_id'=>$users_id, 'active'=>true),
    array('order'=>'`date` DESC')
);

这是一大堆代码。我们可以做得更好。只需创建/编辑您的模型方法

public function scopes() {
    return array(
        'sort_by_date_desc'=>array(
            'order'=>'`date` DESC'
        ),
    );
}

public function by_user_id($user_id) {
    $this->getDbCriteria()->addColumnCondition(
        array('users_id'=>$user_id)
    );
    return $this;
}

public function active_only() {
    $this->getDbCriteria()->addColumnCondition(
        array('active'=>true)
    );
    return $this;
}

现在我们可以变魔术了

$videos = Videos::model()->with('user')
    ->by_user_id($users_id)->sort_by_date_desc()
    ->active_only()->findAll();

然后你可以做类似的事情

foreach ($videos as $video)
    echo $video->title . ' by ' . $video->user->name;

如您所见,我们只需调用关系名称即可访问每个视频的用户配置文件。在那里,您拥有与视频相关联的完整用户模型。

于 2013-05-14T13:36:38.067 回答
0

在您的视频模型中,您需要建立关系:

public function relations()
    {
        $relations = array(
            'users'=>array(self::HAS_ONE, 'Videos', 'id'),  
        );
        return $relations;
    }

然后你可以使用数据提供者:

$dataProvider=new CActiveDataProvider('Videos', array(
            'criteria'=>array(
            'with'=>array(
                'users',

                ),
            'together'=>true,   
                'condition'=>'active LIKE '."Active",
            ),


        ));

之后,在 dataprovider 中,您将拥有“活跃”用户的视频。那只是一个例子。在您的 gridview 等中,您可以使用 : $data->(Videos model column here)$data->users->(Users model column here). 或者简单地使用dataprovider。问候。希望这会有所帮助。

于 2013-05-14T12:43:09.493 回答