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) ...
随机推荐
- svn清理失败且乱码 问题解决
由于昨天在网络不好的状态下频繁尝试svn更新,导致今天svn更新时出现:清理失败且乱码的情况如下: 以下是解决方案:1.下载sqlite3.exe ,地址为:http://download.csdn. ...
- Spring-java-模板设计模式
1,模板设计模式指的是将相应的模板方法提取出来在专门的位置定义,然后把相同调用过程操作,通过模板来实现对于模板设计模式而言,一般有两种实现方式 1)基于继承的实现 2)基于组合的实现 Spring的J ...
- 我的Spring学习记录(二)
本篇就简单的说一下Bean的装配和AOP 本篇的项目是在上一篇我的Spring学习记录(一) 中项目的基础上进行开发的 1. 使用setter方法和构造方法装配Bean 1.1 前期准备 使用sett ...
- MultipleOutputs新旧api
package MRNB_V4; import java.io.IOException; import java.util.Iterator; import org.apache.hadoop.con ...
- 异常 SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
使用Spring 的JDBCtemplate 调用数据库的时候 出现了如下的问题 SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-S ...
- [python学习笔记] String格式化
格式化 S % (args...) 方式 特点 str里的占位符同java里的占位符. 优势 这种方式可以限定格式化的时候接受的数据类型. 常见占位符 %d 接收数字,格式化为 十进制 %x 接收数字 ...
- Oracle 每隔5分钟产生2个clsc*.log文件
环境: OS:HP-UNIX 数据库:11.2.0.4 双机RAC (一)现象 在清理Oracle日志的时候,发现在$ORACLE_HOME/log/{instance_id}/client下面存 ...
- TTabControl
1.TTabControl 组件的典型用法TTabControl 组件使用起来,根本不会使程序简单化,所以不提倡使用此组件,可以用TPageControl组件代替.与多页组件不同的是,虽然Tab 组件 ...
- Linux命令行与脚本编程大全第一章
1, 2,linux内核:内存管理.进程管理.文件管理.设备管理. 其中内存管理如下图: 通过命令 cat/proc/meminfo查看系统的内存状态.通过ipcs查看共享内存.信号量.消息队列信息. ...
- bzoj3156 防御准备 - 斜率优化
Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Output 共一个整数,表示最小的战线花费值. Sample Input 102 3 ...