[已解决]AR中是否可以设置字段别名呢?

没有找查到相关的资料,还请指点指点。

为了解决相同的业务,但不同的项目表结构会不同的情况。

如果你在select时定义了别名,那么你在model类里声明一个该别名的变量就可以了。

1.在upate,delete,insert时,有没有什么方法也可以应用别名呢?

2.以下的情况,我没有写select语句,有没有什么方法可以实现在程序中只操作别名来获取数据呢?

在通过modelName::model()->findAll()获取所有的记录后,就可以通过modelName->字段别名,来取得相应的字段值。

在这样的情况下我没有写selset语句,不知道能否实现别名操作。

3.有没有什么映射机制呢?比如,就只在model中写明别名与字段的映射关系就可以在语句中操作别名了。

AR 本身没提供字段名映射机制。你可以考虑自己实现一下这个功能?;)

谢谢,如果自己实现了,一定发给强哥。

只解决了不用写sql语句的解决办法,还请强哥指点一下,还有什么情况要考虑进来。

解决方法如下:

class DreamBaseAR extends CActiveRecord

{

    /**

    * 字段别名数组,

    *        key:字段别名;

    *        value:字段名

    *

    * @var array

    */

    public $_fieldsArias = array();

   

   

    public function __get($name) {

        if (isset($this->_fieldsArias[$name])) {

            return parent::__get($this->_fieldsArias[$name]);

        }

        else {

            return parent::__get($name);

        }     

    }

}

class TestAr extends DreamBaseAR

{

    /**

    * 字段别名

    *

    * @var array

    */

    public $_fieldsArias = array(

        'uid' => 'userid',

        'uname' => 'username',

        'ustate' => 'userstate',

        'uid' => 'userid',

    );

    public function tableName() {

        return 'user';

    }

}

在取字段值时,就可以通过别名来获取字段的值了,代码片段如下:

在controller中:

$testAr = TestAr::model()->findAll();

foreach ( $testAr as $ar) {

    echo "<p>字段userid的值:{$ar->uid}</p>";

}

如有不当地方,还请指正

这样是可以的,还有setter也需要重写。

强哥回复好快呀,还没睡呢?

现把__set方法补上!

代码如下:

class DreamBaseAR extends CActiveRecord

{

    /**

    * 字段别名数组,

    *        key:字段别名;

    *        value:字段名

    *

    * @var array

    */

    public $_fieldsArias = array();

 

 

    public function __get($name) {

        if (isset($this->_fieldsArias[$name])) {

            return parent::__get($this->_fieldsArias[$name]);

        }

        else {

            return parent::__get($name);

        }     

    }

   

public function __set($name,$value)


{


 	if (isset($this-&gt;_fieldsArias[$name])) {

        parent::__set($this->_fieldsArias[$name],$value);

    }

    else {

        parent::__set($name,$value);

    } 

}

}

class TestAr extends DreamBaseAR

{

    /**

    * 字段别名

    *

    * @var array

    */

    public $_fieldsArias = array(

        'uid' => 'userid',

        'uname' => 'username',

        'ustate' => 'userstate',

        'uid' => 'userid',

    );

    public function tableName() {

        return 'user';

    }

}

在取字段值时,就可以通过别名来获取字段的值了,代码片段如下:

在controller中:

$testAr = TestAr::model()->findAll();

foreach ( $testAr as $ar) {

    echo "<p>字段userid的值:{$ar->uid}</p>";

}