homepagePHP/docs/Model.md

168 lines
5.4 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 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_idpost_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 查询表达式参数
```