Yii2之AR类的坑与总结
本文主要记录本人从学习yii2到使用yii2开发项目过程中遇到的一些问题以及解决方法和知识点总结。
1. AR类关联哪个数据表?
默认情况下,AR类会根据类名称关联和类名相关的数据表,如:类名为Country时,关联数据表为country;类名为CountrySearch时,关联数据表为country_search。如果在数据库配置中通过“tablePrefix”参数配置了数据表前缀,默认还会加上表前缀。若需要关联的数据表名称和AR类名称不存在这种映射关系,则需要实现tableName()方法返回关联的数据表名称,例如,Country类需要关联country2数据表,可以实现如下:
public static function tableName(){
return '{{%country2}}';
}
其中使用%表示使用数据库配置的表前缀。
2. 执行AR类load()方法块赋值之后,执行save()方法插入或更新数据记录,得到对应记录的数据字段都为空,或者使用了数据表定义的默认值,没有定义默认值而且定义了“not null”的字段还会报错“doesn’t have a default value”?
这种情况下就很纠结了,代码、数据表看起来都是对的,但结果就是不如人意。其实这与AR类的块赋值有关。块赋值的时候,AR类会优先赋值“public”和“protected”属性的类成员变量,找不到对应成员变量的时候再去赋值关联数据表中同名的字段。所以,出现这种问题,应该是在AR类中声明了和该类关联数据表字段同名的“public”或“protected”成员变量,块赋值的时候AR类就会把值赋给了成员变量,而数据表的同名字段其实并没有被赋值。
3. 所有表单逻辑都在AR类实现好,还是创建表单模型来分别处理各个表单比较好?
若所有表单逻辑都在AR类实现,势必需要定义多个场景来区分,当表单越来越多的时候场景也会越来越多,而且可能每次增加场景之后验证规则也要做相应调整,若不细心还会影响其他场景,代码不够清晰。而且可能有些表单要用到的数据表中没有的一些属性还需要定义为AR类的成员变量并添加对应验证规则,验证规则会很乱。若一个表单使用一个表单模型来管理的话,会让代码变得更清晰,更易于维护,但是表单越来越多的时候表单模型类也会越来越多,不过可以使用不同目录来存放模型文件。
所以,这两种方法各有优缺点,但后者更为可取。
4. 本想更新一条数据记录,结果插入了一条新的记录?
若想使用模型类的save()或update()方法修改数据表数据,需要先找到对应的记录再去更新数据,否则更新失败。因为模型类需要根据模型对象的_oldAttributes属性去更新对应数据记录,若该属性为空则模型会认为需要插入一条新的记录。
持续更新中...
Yii2之AR类的坑与总结的更多相关文章
- Yii 1.1.17 四、属性标签、AR类增删改查、使用上传类与扩展第三方类库
一.属性标签与规则设置 当进入网站页面,将会读数据库返回信息到视图上.那么,现在定义模型中的属性在视图标签上的显示, 也就是模型属性到前台标签的映射 // 定义模型属性到前台标签的映射 public ...
- Java URL类踩坑指南
背景介绍 最近再做一个RSS阅读工具给自己用,其中一个环节是从服务器端获取一个包含了RSS源列表的json文件,再根据这个json文件下载.解析RSS内容.核心代码如下: class Presente ...
- Yii2 数组助手类arrayHelper
数组助手类 ArrayHelper 1.什么是数组助手类 Yii 数组助手类提供了额外的静态方法,让你更高效的处理数组. a.获取值(getValue) class User { public $na ...
- Yii2 数据搜索类 PostSearch
数据搜索类 PostSearch /** * @Purpose : 添加 authorName 属性,使属性和搜索表单相对应 * @return array */ public function at ...
- yii2封装一个类控制div宽度,高度
1.首先,封装一个类,放在文件夹vendor下,命名为articls.php. <?phpclass Articles{ //测试 function add() { r ...
- Ubuntu 安装yii2 advanced版 遇到的坑
1.安装 Composer https://www.yiichina.com/doc/guide/2.0/start-installation通过 Composer 安装 curl -sS https ...
- String类面试坑题
1.面试坑题F:\SHJT\JavaWorkspace\JavaSE\workspace\day13ezra\src\cn\itcast\sh\classcode\BTStringLastIndexO ...
- java springboot调用第三方接口 借助hutoool工具类 爬坑
楼主是个后端小白一枚,之前没接触过后端,只学了java基本语法,还是在学校老师教的,学的很浅,什么ssh.ssm框架都没有学,最近在自学spring boot,看书学也看不是很懂,就在b站上看教学视频 ...
- 【python基础】datetime类各种坑
import datetime end_time = 1525104000000 d = datetime.datetime.fromtimestamp(end_time / 1000, None) ...
随机推荐
- 从instr中截取第一个delimiter之前的内容放到outstr中,返回第一个delimiter之后的位置
从instr中截取第一个delimiter之前的内容放到outstr中,返回第一个delimiter之后的位置 char *msstrtok(char *instr, char *outstr, ch ...
- jmeter测试HTTP请求
HTTP超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.(详情参考看一下百科) HTTP发送请求有GE ...
- 个人理解---在开发中何时加入日志记录功能[java]
是这样的:俩个月前做的一个小功能,今天经理突然问我这个'清除复投记录'功能是不是我做的,我说是,很久以前了.他说昨天一个客户找过来了,后台把人家的复投记录清除掉了,不知道何时清除的,我记得当时做的时候 ...
- docker应用笔记
first install it: 首先安装: apt install docker.io 基本概念: 镜像:相当于虚拟机里的磁盘文件,里面有一套配置好的系统,应用程序 容器:相当于一个虚拟机实例,一 ...
- OC——继承
继承的其中一个很重要的目的是为了实现多态.我们现在先来看看OC的继承. 一.继承 父类: 头文件 // // Peason.h // 01-继承和多态 // // Created by zhangji ...
- String类的简要概述(1)
String类时我们平时用的比较多的一个类,该类属于java中引用数据类型. String类里面有很多方法需要我们学习.如切割,追加,拼接等. String s = "abcdef" ...
- 压缩感知中的lp球:p范数最优化为什么总会导致一个稀疏的解的原因
转自:彬彬有礼. 压缩感知中的lp球:p范数最优化为什么总会导致一个稀疏的解的原因 http://blog.csdn.net/jbb0523/article/details/40268943 题目: ...
- 【maven插件】maven-shade-plugin
概述 该插件提供了将artifact打包到一个本地jar包的能力,包括其依赖关系以及一些参数如 shade -rename重命名依赖关系的包. 目标 shade:shade 绑定到建生命周期中的pac ...
- Linux入门之常用命令(13) crontab
为当前用户创建cron服务 1. 键入 crontab -e 编辑crontab服务文件 例如 文件内容如下: */2 * * * * /bin/sh /home/admin/jiaoben/bu ...
- hdu 5937 -- Equation(搜索)
题目链接 problem description Little Ruins is a studious boy, recently he learned addition operation! He ...