php - 如何用yii2 ActiveRecord在处理mysql所有表insert的时候,实现默认主键为uuid的简便方法吗?

 翔英建辉千慧 发布于 2022-11-20 21:20

就是用Mysql自带的这个

select uuid();

在ActiveRecord里该如何处理

id = 'uuid()';
...
$model->save();

问题:显然上面这种方法是不行的,有没有其他的处理方式

3 个回答
  • $model->save() 后$model->id 取不到按照这种方法,保存是可以实现的

    2022-11-20 21:31 回答
  • 确定 id 是字符串类型, 然后试下这样:

    $model->id = new \yii\db\Expression('uuid()');
    
    2022-11-20 21:31 回答
  • 在ActiveRecord::behaviors()里增加一个PrimaryKeyBehavior来处理ActiveRecord::EVENT_BEFORE_INSERT这种方法可行

    class PrimaryKeyBehavior extends AttributeBehavior
    {
        public $primaryKeyAttribute = 'id';
        
        public $value;
    
        public function init()
        {
            parent::init();
    
            if (empty($this->attributes)) {
                $this->attributes = [
                    BaseActiveRecord::EVENT_BEFORE_INSERT => [$this->primaryKeyAttribute],
                ];
            }
        }
    
        protected function getValue($event)
        {
            return new Expression('UUID()');
        }
    
    }

    在model里调用

    class Test extends \yii\db\ActiveRecord
    {
        ...
        public function behaviors()
        {
            return [
                \common\behaviors\PrimaryKeyBehavior::className(),
            ];
        }
        ...
    }

    这种方法可以实现灵活调用,在有需要的Model里调用,并且不用在写逻辑的时候加上$model->id = uuid()

    2022-11-20 21:31 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有