168 lines
5.4 KiB
Markdown
Executable File
168 lines
5.4 KiB
Markdown
Executable File
## Model
|
||
|
||
### auto
|
||
|
||
增加传递新增记录给function或者callback的方法
|
||
|
||
```php
|
||
protected $_auto = array(
|
||
//第六个参数设置为true,可以接收到新增的记录
|
||
//此时如果不需要通过第五个参数额外传递数据,可设置为null
|
||
['sample_filed', 'sampleCallback', parent::MODEL_INSERT, 'callback', null, true]
|
||
);
|
||
```
|
||
|
||
### 封印字段
|
||
|
||
可设置不可修改和新增的字段
|
||
|
||
场景:有些字段是由触发器维护的,应用层不应该修改这些字段。但随着系统开发的深入,维护时间的增加。经常会忘记了这个原则,导致了不经意间修改了该字段,产生了难以调试的bug。
|
||
|
||
用法:
|
||
|
||
```php
|
||
//在model设置 触发器维护字段order_no
|
||
protected $_seal_fields = [
|
||
'order_no'
|
||
];
|
||
```
|
||
|
||
### 清除数据库缓存
|
||
|
||
clearCache 方法
|
||
|
||
参数options 通过该参数可以设置Modal对象的options属性
|
||
|
||
## 删除验证
|
||
|
||
删除数据前,验证是否满足删除条件,如果不满足则禁止删除,并返回不能删除的原因
|
||
|
||
1. 存在数据,则禁止删除
|
||
|
||
检查指定的表和关联字段,如果存在数据,则禁止删除
|
||
|
||
```php
|
||
protected $_delete_validate = array(
|
||
array('Access', 'role_id', parent::EXIST_VALIDATE , '请先清空用户组权限'),
|
||
array('RoleUser', 'role_id', parent::EXIST_VALIDATE , '请先清空用户组下面的用户数据'),
|
||
);
|
||
```
|
||
|
||
设定回调函数,回调函数返回更复杂的信息验证,返回数据结果集,根据验证策略决定是否可删除
|
||
|
||
```php
|
||
protected $_delete_validate = array(
|
||
array(function($ids){
|
||
return D("Access")->where(['role_id', ['in', $ids]])->select();
|
||
}, '', parent::EXIST_VALIDATE, '请先清空用户组权限')
|
||
);
|
||
```
|
||
|
||
2. 不存在数据,则禁止删除
|
||
|
||
用法同1,第三个参数改成 parent::NOT_EXIST_VALIDATE
|
||
|
||
```php
|
||
protected $_delete_validate = array(
|
||
array('Access', 'role_id', parent::NOT_EXIST_VALIDATE, '缺少数据,不能删除')
|
||
);
|
||
```
|
||
|
||
3. 指定字段,当该字段值为设定范围时,禁止删除
|
||
|
||
```php
|
||
protected $_delete_validate = array(
|
||
array(array('2'), 'group', parent::NOT_ALLOW_VALUE_VALIDATE, '不能删除系统组的配置项'),
|
||
);
|
||
```
|
||
|
||
4. 指定字段,当该字段值为设定范围时,才允许删除
|
||
|
||
```php
|
||
protected $_delete_validate = array(
|
||
array(array('2'), 'group', parent::ALLOW_VALUE_VALIDATE, '不能删除系统组的配置项'),
|
||
);
|
||
```
|
||
|
||
|
||
|
||
## 联动删除
|
||
|
||
在进行一些表删除操作时,很可能要删除另外几张表的特定数据。联动删除功能只需在Model里定义好联动删除规则,在删除数据时即可自动完成另外多张表的删除操作,可大大简化开发的复杂度。
|
||
|
||
使用样例
|
||
|
||
```php
|
||
//假设有一张文章表Post, 评论表 Message, 点赞表 Like。
|
||
//点赞表有字段type, type_id, 当type=4时,type_id指向文章表的主ID
|
||
//评论表有字段post_id,post_id与文章表的主id关联
|
||
//这时我们可以在Model里定义 _initialize方法,在该方法内定义 _delete_auto 规则
|
||
protected function _initialize() {
|
||
$this->_delete_auto = [
|
||
//实现Message表的联动删除
|
||
['delete', 'Message', ['id' => 'post_id']],
|
||
//实现点赞表的联动删除,$ent参数就是存放Post表的记录的实体变量
|
||
['delete', function($ent){
|
||
D('Like')->where(['type' => 4, 'type_id' => $ent['id']])->delete();
|
||
}],
|
||
];
|
||
}
|
||
|
||
//如需指定删除联动数据失败时的操作,默认为继续删除,请指定第四参数,如:
|
||
$this->_delete_auto = [
|
||
['delete','Message',['id'=>['post_id'],[
|
||
'error_operate'=>self::DELETE_CONTINUE //继续删除
|
||
]],
|
||
//或
|
||
['delete','Message',['id'=>['post_id'],[
|
||
'error_operate'=>self::DELETE_BREAK //删除停止并返回错误信息
|
||
]],
|
||
];
|
||
```
|
||
|
||
目前联动删除的定义规则暂时只有两种,第二种规则比第一种规则更灵活,可应用于更多复杂的场景。第一种规则仅能应用在两个表能通过一个外键表达关联的场景。第一种规则在性能上比第二种更优。
|
||
|
||
## TP数据库
|
||
|
||
+ 原生sql写法 Db::Raw
|
||
|
||
> tp会对字符串的sql进行分析,对关键字自动加上``,但做的并不好,会将table方法和field方法的sql解析出语法问题
|
||
>
|
||
> 因此加入了 Db::Raw的方法来阻止tp解析
|
||
>
|
||
> ```php
|
||
> D('Test')
|
||
> ->table(Db::Raw(( 'SELECT @box_id:=null, @rank:=0 ) a'))
|
||
> ->field(Db::Raw('tmp.*, if(@box_id=tmp.box_id, @rank:=@rank+1, @rank:=1) AS rk, @box_id:=tmp.box_id'))
|
||
> ```
|
||
|
||
+ 新增DB_STRICT模式, 在app/Common/Conf/config.php 设置true开启
|
||
|
||
```php
|
||
'DB_STRICT' => env('DB_STRICT', true)
|
||
```
|
||
|
||
strict模式默认启动一下设置
|
||
|
||
'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
|
||
|
||
而非strict模式是
|
||
|
||
'NO_ENGINE_SUBSTITUTION'
|
||
|
||
## 写数据回调函数添加钩子
|
||
```text
|
||
新增、更新、删除数据后对应回调添加钩子,方便扩展包自定义处理
|
||
```
|
||
+ _after_insert 监听钩子:after_insert,参数$params见说明
|
||
+ _after_update 监听钩子:after_update,参数$params见说明
|
||
+ _after_delete 监听钩子:after_delete,参数$params见说明
|
||
|
||
```php
|
||
// $params说明
|
||
// 该变量为数组,元素键说明
|
||
|
||
// model_obj model对象
|
||
// data 数据信息
|
||
// options 查询表达式参数
|
||
``` |