使用YII做后台,使用Yii的AR达不到要求的效果。很急,我该怎么办?

徐建兴 发布于 2014/06/28 10:42
阅读 776
收藏 1
我使用YII作为PHP框架。其中有一个功能是查询附近的人。使用Mysql计算距离并显示出来
我的代码是这样做的:
class NearByController extends Controller
{

    //发现附近的人。这里还没有做筛选。distance在哪里?
    public function  actionIndex()
    {
        $latitude=  UserRefreshForm::model()->getLatitude();
        $longitude=UserRefreshForm::model()->getLongitude();

        $criteria=new CDbCriteria();
        $nearPersons=MGetNear::getNearPersonsNoOrder();
        $criteria->select=' t.*, (ACOS(SIN(('.$latitude.'* 3.1415) / 180 ) *SIN((tbl_myr_refresh.latitude * 3.1415) / 180 ) +COS(('.$latitude.'* 3.1415) / 180 ) * COS((tbl_myr_refresh.latitude * 3.1415) / 180 ) *COS(('.$longitude .'* 3.1415) / 180 - (tbl_myr_refresh.longitude * 3.1415) / 180 ) ) * 6378.137)   as distance';
        $criteria->join='LEFT JOIN tbl_myr_refresh ON tbl_myr_refresh.userId=t.userId';
        $criteria->addInCondition('t.userId',$nearPersons);
        $criteria->order='distance ASC';
        $UserModel=User::model();
        $total=$UserModel->count($criteria);
        $pager=new CPagination($total);
        $pager->pageSize=10;
        $pager->applyLimit($criteria);
        $userList=$UserModel->findAll($criteria);
 p($userList);

}


我是使用Mysql来计算距离的。 但是当我打印出来的时候发现没有distance这个属性: 

Array

[0] => User Object (

 [password1] => [password2] => [geohash] => [_new:CActiveRecord:private] => [_attributes:CActiveRecord:private] => 

Array ( [userId] => 3 [username] => [password] => c3284d0f94606de1fd2af172aba15bf3 [email] => 741691740@qq.com [phoneNumber] => [birthday] => 1992-11-01 [gender] => 1 [homeland] => 四川南充 [wantWhere] => [registerDate] => 2014-06-27 [smallAvatar] => smallAvatar140385273350016.jpg [bigAvatar] => bigAvatar140385273350016.jpg [qrcode] => [isStudent] => 1 [wentWhere] => [md5] => f2300adcae381de30ae58c8f4309dda9 [sessionId] => o5fcapmo7clfiiua717n1aa525 [iemi] => 123456789 ) [_related:CActiveRecord:private] => Array ( ) [_c:CActiveRecord:private] => [_pk:CActiveRecord:private] => 3 [_alias:CActiveRecord:private] => t [_errors:CModel:private] => Array ( ) [_validators:CModel:private] => [_scenario:CModel:private] => update [_e:CComponent:private] => [_m:CComponent:private] => ) )




也就是Yii只把user表中有的打印出来了。但是distance这个属性没有打印出来! 求救。YII大神告诉我该如何获得这个distance属性?


加载中
0
s
sp村长
public function populateRecord($attributes,$callAfterFind=true)
    {
        if($attributes!==false)
        {
            $record=$this->instantiate($attributes);
            $record->setScenario('update');
            $record->init();
            $md=$record->getMetaData();
            foreach($attributes as $name=>$value)
            {
                if(property_exists($record,$name))
                    $record->$name=$value;
                elseif(isset($md->columns[$name]))
                    $record->_attributes[$name]=$value;
            }
            $record->_pk=$record->getPrimaryKey();
            $record->attachBehaviors($record->behaviors());
            if($callAfterFind)
                $record->afterFind();
            return $record;
        }
        else
            return null;

    }


看这个方法,只有 有属性和元数据的字段才会遍历出,其实你可以在model中添加一个这样的属性

徐建兴
徐建兴
给力!将我的问题解决了!!
0
纯洁徐
纯洁徐
distance把这个换个名字测一下咯 或者换个固定的值, 还有加上ifnull() if(,0,) 这样的函数 之类 
fatrbaby
fatrbaby
回复 @徐建兴 : 你吹牛,你没用过relation么?
徐建兴
徐建兴
他这个跟名字有什么关系呀!貌似是Yii的缺点,就是如果是User::model的话就只能查user的,其他不在user表的信息是查询不到的
0
s
sp村长
YII 这方面是跟model 的 attribute关联起来的
徐建兴
徐建兴
就是attribute里面没有distance这个属性呀!
返回顶部
顶部