db类进阶
<h3>获取当前db使用的pdo对象</h3>
<pre><code>$pdo = $db->PDO;</code></pre>
<h3>获取查询句柄</h3>
<p><strong>返回的是查询结果的pdo句柄</strong></p>
<pre><code>$h = $db->where($where)->Fetch();
while($row = $h->fetch(\PDO::FETCH_ASSOC)){
// 遍历每行数据...
}</code></pre>
<h3>事务处理</h3>
<ul>
<li>开始事务处理
<pre><code>$db->Begin();</code></pre></li>
<li>提交事务
<pre><code>$db->Commit();</code></pre></li>
<li>回滚事务
<pre><code>$db->Rollback();</code></pre></li>
</ul>
<h3>子查询 SubQuery()</h3>
<pre><code>// 跟 Select() 的用法相同,只是返回构造好的sql语句
$sql = $db->Where($where)->SubQuery('uid');
$where['uid IN'] = $sql; //Where条件中加入子查询
$data = $db->Where($where)->Select();</code></pre>
<h3>合并查询 Merge()</h3>
<pre><code>$s1 = $db->Table($table)->Where($where)->SubQuery();
$s2 = $db->Table($table)->Where($where)->SubQuery();
// 合并结果集,默认去除重复行
$data = $db->Table($table)->Where($where)->Merge([$s1, $s2])->Select();
// 第二个参数 'ALL',不去除重复行
$data = $db->Table($table)->Where($where)->Merge([$s1, $s2], 'ALL')->Select();</code></pre>
<h3>从结果集中再查询 Tmp()</h3>
<p><strong>此处Tmp()类似于Table()</strong></p>
<pre><code>$tmp = $db->Table('user')->Where(['uid >'=>10])->SubQuery();
$data = $db->Tmp($tmp)->Where(['uid <'=>15])->Select();
// 第二个参数指定别名
$data = $db->Tmp($tmp, 'a')->Where(['a.uid <'=>15])->Select();</code></pre>
<h3>查询缓存 Cache()</h3>
<p><strong>缓存方式在配置文件DB的 cache_mod 字段</strong></p>
<pre><code>$data = $db->Where($where)->Cache(60)->Select(); //缓存60秒
//支持分页缓存,分页参数是固定的,否则也就没必要缓存了
$conf = ['num' => $num, 'p' => $p, 'return' => true];
$data = $db->Where($where)->Page($conf)->Cache(60)->Select();
$page = $db->GetPage();</code></pre>
<h3>清理缓存 CleanCache()</h3>
<pre><code>$db->CleanCache($db_name, $table);
// 删除$db_name库的$table表的缓存($table必须是带有前缀的完整表名,如果为空则是删除$db_name下的所有缓存)</code></pre>
<h1>数据库结构文件(包含自动验证,写入回调等)</h1>
<p><strong><font color=red>此配置只针对 db类操作有效</font></strong>
<strong>自动验证需要用到数据库结构文件(数据库名.base.php),文件位置请参见项目结构</strong></p>
<pre><code>return [
/**user表的配置**/
'user'=>[
/**主键名,建议添加此字段,可以优化查询**/
'prikey'=>'id',
/**
* 可操作字段
* 此配置影响 插入,修改,以及不指定查询字段的操作
* 不在此数组中字段无法添加和修改
* 查询数据时未指定Field或Field为*则只返回此数组中的字段
*/
'columns'=>['id', 'uid', 'username', 'passwd', 'regtime'], // 可操作字段
/**
* 字段别名
* 此配置影响查询返回的字段名
* 格式是 实际字段名 => 要返回的字段名
*/
'alias'=>['userid'=>'uid','username'=>'name','password'=>'passwd'],
/**
* 自动验证规则
* '!'字段(感叹号)是返回时机:
* 为null或者留空:需要调用Valid方法执行验证
* 1(默认):某一个条件不满足时就返回
* 2:某一个字段不满足时返回
* 其它:验证完全部字段后返回
*/
'valid'=>[
'!'=>2,
'username'=>[
'must'=>true, // 不管是否有此字段都要验证
'when'=>'both', //验证时机
'notnull'=>'账号不能空',
'unique'=>'该账号已被注册',
function($val, $data, $db){ // 自定义回调函数验证
return $val === filter_var($val, FILTER_SANITIZE_EMAIL) ? 0 : '账号不可含有特殊字符';
}
],
'passwd'=>[
'length'=>[
'value'=>[6, 16],
'msg'=>'密码长度在6-16位之间',
],
function($val, &$data, $db){ // 注意此处是引用方式使用 $data,以便修改待入库的数据
if(isset($data['repasswd'])){
if($val !== $data['repasswd']) return '确认密码不正确';
unset($data['repasswd']); // 删除字段以便入库
}
$data['passwd'] = md5($data['passwd']); //加密密码以便入库
}
]
],
/**
* 数据库执行写入操作后的回调
* 可接收 $params, $db 两个参数
* $params 参数根据操作不同,会包含[result, data, sql, bind, where]等字段
* $db 是当前的 db 对象
*/
'call'=>[
'update'=>function($params, $db){
$id = $db->getWhereByKey('id'); // 获取本次操作数据行的主键
// 执行操作...
},
'insert'=>function($params, $db){
// 执行操作...
},
'delete'=>function($params, $db){
// 执行操作...
},
],
],
/**其他数据表**/
'other'=>[
...
],
]</code></pre>
<h3>规则格式</h3>
<ul>
<li><strong>没有参数的规则格式: 规则名称 => 错误信息</strong></li>
<li><strong>有参数的规则格式:规则名称 => [value => 参数值, msg => 错误信息, invert => 此值为真的话验证结果取反]</strong></li>
</ul>
<h3>支持的规则:</h3>
<table>
<thead>
<tr>
<th>名称</th>
<th>参数</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>must</td>
<td>bool</td>
<td>为真时不管是否有此字段都要验证</td>
</tr>
<tr>
<td>when</td>
<td>string</td>
<td>该字段的验证时机,insert:插入数据时验证,update:更新数据时验证,both:两者都要验证</td>
</tr>
<tr>
<td>notnull</td>
<td>无</td>
<td>不能空</td>
</tr>
<tr>
<td>unique</td>
<td>无</td>
<td>唯一</td>
</tr>
<tr>
<td>number</td>
<td>无</td>
<td>数字</td>
</tr>
<tr>
<td>ip</td>
<td>无</td>
<td>ip地址</td>
</tr>
<tr>
<td>url</td>
<td>无</td>
<td>url地址</td>
</tr>
<tr>
<td>email</td>
<td>无</td>
<td>email地址</td>
</tr>
<tr>
<td>phone</td>
<td>无</td>
<td>手机号码</td>
</tr>
<tr>
<td>preg</td>
<td>string(正则表达式)</td>
<td>正则</td>
</tr>
<tr>
<td>int</td>
<td>int,array</td>
<td>数字范围</td>
</tr>
<tr>
<td>length</td>
<td>int,array</td>
<td>长度范围</td>
</tr>
<tr>
<td>filter</td>
<td>传递给filter_var的参数</td>
<td>调用php的 filter_var</td>
</tr>
<tr>
<td>function</td>
<td>无</td>
<td>函数验证,可接收参数:<br>(待验证的值,原始的数据数组,当前db对象)<br>返回值不为假视作验证失败的提示信息,<br>返回假或无返回视作验证通过</td>
</tr>
</tbody>
</table>
<h3>手动执行验证 Valid()</h3>
<pre><code>$db->Valid($data, 'insert', 1); // 成功返回数据$data, 失败返回 false
$err = $db->getError(); // 获取错误信息
// $data 是待验证的数据
// 第二个参数是验证时机:insert 或 update
// 第三个参数是返回时机
</code></pre>