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) ...
随机推荐
- 子元素设定margin值会影响父元素
有些情况下,我们设定父元素下的子元素margin值时,父元素会被影响. 这是个常见问题,而且只在标准浏览器下 (FirfFox.Chrome.Opera.Sarfi)产生问题,IE下反而表现良好. 例 ...
- apache: eclipse的tomcatPluginV插件下载
Sysdeo Eclipse Tomcat Launcher plugin Plugin features Support and contributions Download Installatio ...
- JVM(三)内存回收(一)
最近花了相当长一段时间在看Hotspot JVM的GC和内存分配,本节先总结和回顾一下内存回收的相关知识点,内存的分配放到下节再讨论. 一.什么是JVM的GC GC即Garbage Collectio ...
- 基于FPGA的腐蚀膨胀算法实现
本篇文章我要写的是基于的腐蚀膨胀算法实现,腐蚀膨胀是形态学图像处理的基础,,腐蚀在二值图像的基础上做"收缩"或"细化"操作,膨胀在二值图像的基础上做" ...
- linux环境下根据文件的某一列进行去重
momo@ubuntu:~/user/txt$ cat test.txt1 chen nihao2 chen hello3 li nimenhao4 he dajiahao5 li nimenhaom ...
- JS -- Variables As Properties
Variables As Properties When you declare a global JavaScript variable, what you are actually doing i ...
- notepad的快捷操作-代码速写
(一)先安装zencode插件 (二)运用插件 第一步:键入:html:xt 再Ctrl+Alt+Enter键 得到 <!DOCTYPE html PUBLIC "-//W3C//DT ...
- PHP抓取网页图片
<?php set_time_limit(0);//抓取不受时间限制 if($_POST['Submit']=="开始抓取"){ $URL=$_POST['link']; g ...
- Java 浅拷贝和深拷贝的理解和实现方式
Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去.举例说明:比如,对象A和对象B都属于类S,具有属性a和b.那么对对象A进行拷贝 ...
- 跨平台的 NodeJS 组件解决 .NetCore 不支持 System.Drawing图形功能的若干问题
问题 生成缩略图 生成验证码 生成二维码 给图片加水印 外部引用 Node 不解释 https://nodejs.org/en/download/ sharp 高性能缩略图 https://gi ...