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) ...
随机推荐
- phpcms图文总结(转)
转自:http://www.cnblogs.com/Braveliu/p/5074930.html 在实现PHPCMS网站过程中,根据业务需求,我们遇到很多问题,特此总结如下,以便大家参考学习. [1 ...
- 多线程面试题系列(5):经典线程同步 关键段CS
上一篇提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题.本文首先介绍下如何使用关键段,然后再深层次的分析下关键段的实现机制与原理.关键段CRITIC ...
- python数据分析panda库
panda内有两种数据结构,Series()和DataFrame() >>> a=pd.Series([1,2],index=['a','b']) >>> a a ...
- 微软云Linux服务器 Mysql、tomcat远程连接错误解决办法
在微软云linux服务器成功配置好mysql.tomcat,通过外部链接却发现一直错误.Mysql 一直提示错误代码2003, tomcat连接一直提示EOF. 反复检查配置都无问题,最后得知是微软云 ...
- AngularJS概念概述和第一个使用例子
点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ 概念概述 本节使用一个简单的例子简要介绍了AngularJS的重要组成部分. 概念 描述 ...
- SLB vs CLB
什么是SLB? SLB, 服务器负载均衡(Server Load Balancing),可以看作HSRP(热备份路由器协议)的扩展,实现多个服务器之间的负载均衡. 虚拟服务器代表的是多个真实服务器的群 ...
- 关于 LindedList 我想说
LinkedList 的一些认识: 继承于AbstractSequentialList的双向链表,可以被当作堆栈.队列或双端队列进行操作 有序,非线程安全的双向链表,默认使用尾部插入法 适用于频繁新增 ...
- Coin Change (II)(完全背包)
Coin Change (II) Time Limit: 1000MS Mem ...
- mysql error 1130 hy000:Host 'localhost' is not allowed to connect to this mysql server 解决方案
ERROR 1130 (HY000): Host 'localhost' is not allowed to connect to this MySQL server D:\Wamp\mysql-\b ...
- 基于LoadRunner11,以wifi热点方式录制APP脚本简单指导
本想详细写下操作过程,但并不觉着十分必要,通过baidu或我要自学网均能找到相关资料,所以详细操作过程不再赘述,只是把过程中遇到的问题说明下解释下,让大家“录制APP”的路更平坦! 1.如何使用Loa ...