ActiveRecord 怎么让 form 中的字段和数据表中的字段不一致,在插入数据库时候字段映射 [ 2.0 版本 ]
Yii 2.0 ActiveRecord 插入数据库都时候,form 中的字段和数据表中的字段名不一致,怎么不改变 form 中都名称和数据表中的字段名,让他们完成一一映射,完成数据库插入,是用 ActiveRecord 中的 attributes()
吗还是,麻烦大佬给讲下,谢谢
类似于下面:
ThinkPHP 的字段映射功能可以让你在表单中隐藏真正的数据表字段,而不用担心放弃自动创建表单对象的功能,假设我们的 User 表里面有 username 和 email 字段,我们需要映射成另外的字段,定义方式如下:
Class UserModel extends Model{
protected $_map = array(
'name' =>'username', // 把表单中name映射到数据表的username字段
'mail' =>'email', // 把表单中的mail映射到数据表的email字段
);
}
这样,在表单里面就可以直接使用 name 和 mail 名称作为表单数据提交了。在保存的时候会字段转换成定义的实际数据表字段。字段映射还可以支持对主键的映射。
最佳答案
-
yii的attributeLabels和attributeHints是这样的
public function getAttributeLabel($attribute) { $labels = $this->attributeLabels(); return isset($labels[$attribute]) ? $labels[$attribute] : $this->generateAttributeLabel($attribute); } public function getAttributeHint($attribute) { $hints = $this->attributeHints(); return isset($hints[$attribute]) ? $hints[$attribute] : ''; }
但是你的需求是要逆过来
如果活动记录里面有name字段,你表单传过来的时候username//控制器里面 public function actionModelTest(){ $model = new TestModel(); //实例活动记录 $model->username = "test"; } //活动记录里面 class TestMode extends ActiveRecord{ }
这样的活走的是模式方法get
public function __get($name) { if (isset($this->_attributes[$name]) || array_key_exists($name, $this->_attributes)) { return $this->_attributes[$name]; } if ($this->hasAttribute($name)) { return null; } if (isset($this->_related[$name]) || array_key_exists($name, $this->_related)) { return $this->_related[$name]; } $value = parent::__get($name); if ($value instanceof ActiveQueryInterface) { $this->setRelationDependencies($name, $value); return $this->_related[$name] = $value->findFor($name, $this); } return $value; }
核心就是hasAttribute方法,会去推到出表结构,然后判断是否存在,
所以可以重新get魔术方法public $attributeMap = [ "username" => name, ]; public function __set($name, $value){ if(isset($this->attributeMap[$name])){ $this->setAttribute($this->attributeMap[$name],$value); } else { parent::__set($name, $value); } }
一些yii的源码解析,欢迎star~
https://github.com/Zhucola/yii_core_debug
其他 2 个回答
零零零
注册时间:2018-07-26
最后登录:2024-10-30
在线时长:18小时29分
最后登录:2024-10-30
在线时长:18小时29分
- 粉丝1
- 金钱465
- 威望0
- 积分645