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) ...
随机推荐
- 多线程面试题系列(12):多线程同步内功心法——PV操作上
上面的文章讲解了在Windows系统下实现多线程同步互斥的方法,为了提高在实际问题中分析和思考多个线程之间同步互斥问题的能力,接下来将讲解PV操作,这也是操作系统中的重点和难点.本文将会先简要介绍下P ...
- Java实现3DES加密--及ANSI X9.8 Format标准 PIN PAN获取PIN BlOCK
1, 采用银联ANSI X9.8标准 PIN xor PAN获取PIN BlOCK 2, 采用3Des进行加密 参考: des和3Des加密算法实现 要点:因为3DES是对称加密算法,key是24位, ...
- Mybatis(1)
properties 标签的作用引入外部properties 文件的内容typeAliases 的作用可以用package这个标签批量给这个包下的所有类起一个别名 name属性写包的名字. 默认别名为 ...
- Android 之xml解析
HTTP网络传输中的数据组织方式有三种方式:1.HTML方式2.XML方式 3.JSON方式 XML称为可扩展标记语言,它与HTML一样,都是SGML(标准通用标记语言) XML是Internet环境 ...
- angularjs的几种常见写法
学习angularjs不久,遇见的angularjs的写法也是很多的感觉,今天就在这里记录一下,还有没见过的,继续学习中... angularjs 常用的几种种写法 1.链式: angular.mod ...
- 1.Bootstrap-简介
1.介绍 Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 2.HTML 模板 一个使用了 Boots ...
- Java IO学习笔记(一)
一.概念 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.在两设备间的传输的数据称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,以进行数据操作. 二.流分类 数据类型 ...
- Go语言备忘录:基本数据结构
本文内容是本人对Go语言的变量.常量.数组.切片.映射.结构体的备忘录,记录了关键的相关知识点,以供翻查. 文中如有错误的地方请大家指出,以免误导!转摘本文也请注明出处,多谢! 参考书籍<Go语 ...
- mongoDB学习手记1--Windows系统下的安装与启动
第一步:下载安装包 我们首先需要下载 mongodb 的安装包,直接到官网下载即可.地址为:https://www.mongodb.com/download-center#community. 看下自 ...
- java集合系列——List集合总结(六)
一.总结概述 List继承了Collection,是有序的列表. 实现类有ArrayList.LinkedList.Vector.Stack等 ArrayList是基于数组实现的,是一个数组队列.可以 ...