我有带有零填充主键User
的id
表:
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
表示00001
; 2
代表00002
等,但我想保留零并将id
视为string
。
在x32系统上,一切正常,但是我们移至x64。如何强制Active Record将id
视为string
?
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();
}