Yii2 Active Record将zerofill列强制转换为int丢失的零

问题描述 投票:2回答:1

我有带有零填充主键Userid表:

CREATE TABLE `user` (
 `id` int(5) unsigned zerofill NOT NULL AUTO_INCREMENT,
 `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB 

我的User模型看起来像:

class User extends ActiveRecord implements IdentityInterface
{
    public static function tableName()
    {
        return '{{%user}}';
    }
    public static function findIdentity($id)
    {
        $identity = static::findOne(['id' => (int)$id]);

        var_dump($identity); //zeros are lost here
        exit;
    }
    public static function findIdentityByAccessToken($token, $type = null)
    {
        throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
    }
    public function getId()
    {
        return $this->getPrimaryKey();
    }
    public function getAuthKey()
    {
        return $this->auth_key;
    }
    public function validateAuthKey($authKey)
    {
        return $this->getAuthKey() === $authKey;
    }
}

活动记录将id转换为int,所以我得到:1表示000012代表00002等,但我想保留零并将id视为string

在x32系统上,一切正常,但是我们移至x64。如何强制Active Record将id视为string

php activerecord yii2
1个回答
0
投票

Yii从查询结果填充数据中的对象时,使用方法

\yii\db\ColumnSchema::typecast

从数据库检索后,均值将根据[[phpType]]转换输入值。

如果您的ID是整数,那么将使用下一个规则

    case 'integer':
        return (int) $value;

这就是00001转换为1

的原因

我找到了下一个解决方案,不是最好的,但是无论如何

第一解决方案

每次尝试获取ID时都会调用下一个函数

    public function getId()
    {
        return str_pad($this->id, 5, '0', STR_PAD_LEFT);
    }

第二解决方案

覆盖afterFind和afterSave方法


    public function refreshUserId()
    {
        $this->id = str_pad($this->id, 5, '0', STR_PAD_LEFT);
    }

    public function afterFind()
    {
        parent::afterFind();

        $this->refreshUserId();
    }

    public function afterSave($insert, $changedAttributes)
    {
        parent::afterSave($insert, $changedAttributes);

        $this->refreshUserId();
    }
© www.soinside.com 2019 - 2024. All rights reserved.