2024-09-19 08:29:13 +00:00

200 lines
72 KiB
HTML
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.

<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title>数据库 | 炸毛框架 v3</title>
<meta name="description" content="">
<meta name="generator" content="VuePress 1.9.10">
<link rel="icon" href="/logo_trans.png">
<script>
var _hmt = _hmt || [];
(function () {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?f0f276cefa10aa31a20ae3815a50b795";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<meta name="description" content="一个高性能聊天机器人 + Web 框架">
<link rel="preload" href="/assets/css/0.styles.de075592.css" as="style"><link rel="preload" href="/assets/js/app.cf958133.js" as="script"><link rel="preload" href="/assets/js/2.4c04991c.js" as="script"><link rel="preload" href="/assets/js/1.d8755a39.js" as="script"><link rel="preload" href="/assets/js/43.5ee83631.js" as="script"><link rel="prefetch" href="/assets/js/10.960912c3.js"><link rel="prefetch" href="/assets/js/11.cd171694.js"><link rel="prefetch" href="/assets/js/12.ff9ca1d1.js"><link rel="prefetch" href="/assets/js/13.a56deac8.js"><link rel="prefetch" href="/assets/js/14.b222a011.js"><link rel="prefetch" href="/assets/js/15.31489867.js"><link rel="prefetch" href="/assets/js/16.e921dbc4.js"><link rel="prefetch" href="/assets/js/17.58f730d3.js"><link rel="prefetch" href="/assets/js/18.26c46c49.js"><link rel="prefetch" href="/assets/js/19.ee0bfd3b.js"><link rel="prefetch" href="/assets/js/20.bb3578b8.js"><link rel="prefetch" href="/assets/js/21.e66f7fe5.js"><link rel="prefetch" href="/assets/js/22.cba8ca48.js"><link rel="prefetch" href="/assets/js/23.cb49f41c.js"><link rel="prefetch" href="/assets/js/24.d95b175a.js"><link rel="prefetch" href="/assets/js/25.b0d69869.js"><link rel="prefetch" href="/assets/js/26.8e7089c0.js"><link rel="prefetch" href="/assets/js/27.333a53a1.js"><link rel="prefetch" href="/assets/js/28.df4b871c.js"><link rel="prefetch" href="/assets/js/29.5427ad45.js"><link rel="prefetch" href="/assets/js/3.07fc018e.js"><link rel="prefetch" href="/assets/js/30.7cb7445a.js"><link rel="prefetch" href="/assets/js/31.5c4bb546.js"><link rel="prefetch" href="/assets/js/32.7fc05474.js"><link rel="prefetch" href="/assets/js/33.9684a4f8.js"><link rel="prefetch" href="/assets/js/34.83e32a28.js"><link rel="prefetch" href="/assets/js/35.95d03df6.js"><link rel="prefetch" href="/assets/js/36.80aace42.js"><link rel="prefetch" href="/assets/js/37.1eaed2ee.js"><link rel="prefetch" href="/assets/js/38.75fa7a1c.js"><link rel="prefetch" href="/assets/js/39.117f5802.js"><link rel="prefetch" href="/assets/js/4.6623271b.js"><link rel="prefetch" href="/assets/js/40.57eba153.js"><link rel="prefetch" href="/assets/js/41.89c4a7c8.js"><link rel="prefetch" href="/assets/js/42.d8f92f99.js"><link rel="prefetch" href="/assets/js/44.c09b5b0c.js"><link rel="prefetch" href="/assets/js/45.bd850606.js"><link rel="prefetch" href="/assets/js/46.732b1cef.js"><link rel="prefetch" href="/assets/js/47.2a872d0d.js"><link rel="prefetch" href="/assets/js/48.959e18f4.js"><link rel="prefetch" href="/assets/js/49.a9bb32f7.js"><link rel="prefetch" href="/assets/js/5.073233e8.js"><link rel="prefetch" href="/assets/js/50.ca90a854.js"><link rel="prefetch" href="/assets/js/51.79142530.js"><link rel="prefetch" href="/assets/js/52.fe63ad16.js"><link rel="prefetch" href="/assets/js/53.ed84845a.js"><link rel="prefetch" href="/assets/js/54.3ab7e492.js"><link rel="prefetch" href="/assets/js/55.9028e407.js"><link rel="prefetch" href="/assets/js/56.8173f798.js"><link rel="prefetch" href="/assets/js/57.2166b068.js"><link rel="prefetch" href="/assets/js/58.7c52b6bf.js"><link rel="prefetch" href="/assets/js/59.e9965a7b.js"><link rel="prefetch" href="/assets/js/60.f277436c.js"><link rel="prefetch" href="/assets/js/61.3712f8fe.js"><link rel="prefetch" href="/assets/js/8.899a0731.js"><link rel="prefetch" href="/assets/js/9.e2e8da12.js"><link rel="prefetch" href="/assets/js/vendors~docsearch.303532f0.js">
<link rel="stylesheet" href="/assets/css/0.styles.de075592.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="ant-row"><div class="nav-button"><i aria-label="icon: bars" class="anticon anticon-bars"><svg viewBox="0 0 1024 1024" focusable="false" data-icon="bars" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M912 192H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM104 228a56 56 0 1 0 112 0 56 56 0 1 0-112 0zm0 284a56 56 0 1 0 112 0 56 56 0 1 0-112 0zm0 284a56 56 0 1 0 112 0 56 56 0 1 0-112 0z"></path></svg></i> <span></span></div> <div class="ant-col ant-col-xs-24 ant-col-sm-24 ant-col-md-6 ant-col-lg-6 ant-col-xl-5 ant-col-xxl-4"><a href="/" class="router-link-active home-link"><img src="/logo_trans.png" alt="炸毛框架 v3" class="logo"> <span class="site-name">炸毛框架 v3</span></a> <div class="search-box mobile-search"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div></div> <div class="nav-space-between ant-col ant-col-xs-0 ant-col-sm-0 ant-col-md-18 ant-col-lg-18 ant-col-xl-19 ant-col-xxl-20"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><ul role="menu" id="nav" class="ant-menu ant-menu-horizontal ant-menu-root ant-menu-light"><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/guide/">
指南
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/event/">
事件
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/components/bot/bot-context.html">
组件
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/plugins/management.html">
插件
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/advanced/">
进阶
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/update/v3.html">
更新日志
</a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="/doxy/" target="_blank">
API 文档
<i aria-label="icon: link" class="anticon anticon-link"><svg viewBox="64 64 896 896" focusable="false" data-icon="link" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M574 665.4a8.03 8.03 0 0 0-11.3 0L446.5 781.6c-53.8 53.8-144.6 59.5-204 0-59.5-59.5-53.8-150.2 0-204l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3l-39.8-39.8a8.03 8.03 0 0 0-11.3 0L191.4 526.5c-84.6 84.6-84.6 221.5 0 306s221.5 84.6 306 0l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3L574 665.4zm258.6-474c-84.6-84.6-221.5-84.6-306 0L410.3 307.6a8.03 8.03 0 0 0 0 11.3l39.7 39.7c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c53.8-53.8 144.6-59.5 204 0 59.5 59.5 53.8 150.2 0 204L665.3 562.6a8.03 8.03 0 0 0 0 11.3l39.8 39.8c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c84.5-84.6 84.5-221.5 0-306.1zM610.1 372.3a8.03 8.03 0 0 0-11.3 0L372.3 598.7a8.03 8.03 0 0 0 0 11.3l39.6 39.6c3.1 3.1 8.2 3.1 11.3 0l226.4-226.4c3.1-3.1 3.1-8.2 0-11.3l-39.5-39.6z"></path></svg></i></a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="display:none;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li><li role="menuitem" class="ant-menu-item"><a href="https://docs-v2.zhamao.xin/" target="_blank">
炸毛框架 v2
<i aria-label="icon: link" class="anticon anticon-link"><svg viewBox="64 64 896 896" focusable="false" data-icon="link" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M574 665.4a8.03 8.03 0 0 0-11.3 0L446.5 781.6c-53.8 53.8-144.6 59.5-204 0-59.5-59.5-53.8-150.2 0-204l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3l-39.8-39.8a8.03 8.03 0 0 0-11.3 0L191.4 526.5c-84.6 84.6-84.6 221.5 0 306s221.5 84.6 306 0l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3L574 665.4zm258.6-474c-84.6-84.6-221.5-84.6-306 0L410.3 307.6a8.03 8.03 0 0 0 0 11.3l39.7 39.7c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c53.8-53.8 144.6-59.5 204 0 59.5 59.5 53.8 150.2 0 204L665.3 562.6a8.03 8.03 0 0 0 0 11.3l39.8 39.8c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c84.5-84.6 84.5-221.5 0-306.1zM610.1 372.3a8.03 8.03 0 0 0-11.3 0L372.3 598.7a8.03 8.03 0 0 0 0 11.3l39.6 39.6c3.1 3.1 8.2 3.1 11.3 0l226.4-226.4c3.1-3.1 3.1-8.2 0-11.3l-39.5-39.6z"></path></svg></i></a></li><li role="menuitem" class="ant-menu-submenu ant-menu-submenu-horizontal ant-menu-overflowed-submenu" style="visibility:hidden;position:absolute;"><div aria-haspopup="true" class="ant-menu-submenu-title"><span>···</span><i class="ant-menu-submenu-arrow"></i></div></li></ul> <ul class="extra-group"><li><a href="https://github.com/zhamao-robot/zhamao-framework" target="_blank" rel="noopener noreferrer" class="repo-link"><i aria-label="icon: github" class="anticon anticon-github"><svg viewBox="64 64 896 896" focusable="false" data-icon="github" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M511.6 76.3C264.3 76.2 64 276.4 64 523.5 64 718.9 189.3 885 363.8 946c23.5 5.9 19.9-10.8 19.9-22.2v-77.5c-135.7 15.9-141.2-73.9-150.3-88.9C215 726 171.5 718 184.5 703c30.9-15.9 62.4 4 98.9 57.9 26.4 39.1 77.9 32.5 104 26 5.7-23.5 17.9-44.5 34.7-60.8-140.6-25.2-199.2-111-199.2-213 0-49.5 16.3-95 48.3-131.7-20.4-60.5 1.9-112.3 4.9-120 58.1-5.2 118.5 41.6 123.2 45.3 33-8.9 70.7-13.6 112.9-13.6 42.4 0 80.2 4.9 113.5 13.9 11.3-8.6 67.3-48.8 121.3-43.9 2.9 7.7 24.7 58.3 5.5 118 32.4 36.8 48.9 82.7 48.9 132.3 0 102.2-59 188.1-200 212.9a127.5 127.5 0 0 1 38.1 91v112.5c.8 9 0 17.9 15 17.9 177.1-59.7 304.6-227 304.6-424.1 0-247.2-200.4-447.3-447.5-447.3z"></path></svg></i></a></li> <!----></ul></nav></div></div> <!----></header> <aside class="sidebar"><!----> <ul class="sidebar-links"><li><a href="/components/" aria-current="page" title="组件" class="sidebar-link">组件</a></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>机器人组件</span> <span class="arrow right"><i aria-label="icon: down" class="anticon anticon-down"><svg viewBox="64 64 896 896" focusable="false" data-icon="down" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"></path></svg></i></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>HTTP 组件</span> <span class="arrow right"><i aria-label="icon: down" class="anticon anticon-down"><svg viewBox="64 64 896 896" focusable="false" data-icon="down" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"></path></svg></i></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>框架通用组件</span> <span class="arrow right"><i aria-label="icon: down" class="anticon anticon-down"><svg viewBox="64 64 896 896" focusable="false" data-icon="down" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"></path></svg></i></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading open"><span>存储组件</span> <span class="arrow down"><i aria-label="icon: down" class="anticon anticon-down"><svg viewBox="64 64 896 896" focusable="false" data-icon="down" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"></path></svg></i></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/components/store/file-system.html" title="FileSystem 文件系统" class="sidebar-link">FileSystem 文件系统</a></li><li><a href="/components/store/cache.html" title="KV 缓存" class="sidebar-link">KV 缓存</a></li><li><a href="/components/store/redis.html" title="Redis 数据库" class="sidebar-link">Redis 数据库</a></li><li><a href="/components/store/mysql.html" aria-current="page" title="数据库" class="active sidebar-link">数据库</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/components/store/mysql.html#简介" title="简介" class="sidebar-link">简介</a></li><li class="sidebar-sub-header"><a href="/components/store/mysql.html#连接池" title="连接池" class="sidebar-link">连接池</a></li><li class="sidebar-sub-header"><a href="/components/store/mysql.html#连接池模式" title="连接池模式" class="sidebar-link">连接池模式</a></li><li class="sidebar-sub-header"><a href="/components/store/mysql.html#便捷-sqlite-模式" title="便捷 SQLite 模式" class="sidebar-link">便捷 SQLite 模式</a></li><li class="sidebar-sub-header"><a href="/components/store/mysql.html#助手函数" title="助手函数" class="sidebar-link">助手函数</a></li><li class="sidebar-sub-header"><a href="/components/store/mysql.html#使用查询构造器" title="使用查询构造器" class="sidebar-link">使用查询构造器</a></li></ul></li></ul></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>依赖注入组件</span> <span class="arrow right"><i aria-label="icon: down" class="anticon anticon-down"><svg viewBox="64 64 896 896" focusable="false" data-icon="down" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z"></path></svg></i></span></p> <!----></section></li></ul> </aside> <main class="page has-page-anchor"> <div class="theme-antdocs-content content__default"><h1 id="数据库"><a href="#数据库" class="header-anchor">#</a> 数据库</h1> <h2 id="简介"><a href="#简介" class="header-anchor">#</a> 简介</h2> <p>炸毛框架的数据库组件对接了 MySQL、SQLite、PostgreSQL 连接池,在使用过程中无需配置即可实现 SQL 查询,同时拥有高并发。</p> <p>目前 2.5 版本后炸毛框架底层采用了 <code>doctrine/dbal</code> 组件,可以方便地构建 SQL 语句。</p> <p>本章大体查询内容均以下表 <code>users</code> 为基础:</p> <table><thead><tr><th>id</th> <th>username</th> <th>gender</th> <th>update_time</th></tr></thead> <tbody><tr><td>1</td> <td>jack</td> <td>man</td> <td>2021-10-12</td></tr> <tr><td>2</td> <td>rose</td> <td>woman</td> <td>2021-10-11</td></tr></tbody></table> <h2 id="连接池"><a href="#连接池" class="header-anchor">#</a> 连接池</h2> <p>炸毛框架的数据库组件支持原生 SQL、查询构造器去掉了复杂的对象模型关联同时默认为数据库连接池使开发变得简单。</p> <p>数据库的配置位于 <code>config/global.php</code> 文件的 <code>database</code> 段,框架支持多个数据库的连接,其中字段示例如下,下面两段分别为使用 SQLite、MySQL 时的配置项:</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token comment">/* MySQL 和 SQLite3 数据库连接配置,框架将自动生成连接池,支持多个连接池 */</span>
<span class="token variable">$config</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'database'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span>
<span class="token string single-quoted-string">'sqlite_db1'</span> <span class="token operator">=&gt;</span> <span class="token punctuation">[</span> <span class="token comment">// 数据库连接池名称</span>
<span class="token string single-quoted-string">'enable'</span> <span class="token operator">=&gt;</span> <span class="token constant boolean">false</span><span class="token punctuation">,</span> <span class="token comment">// 是否启用</span>
<span class="token string single-quoted-string">'type'</span> <span class="token operator">=&gt;</span> <span class="token string single-quoted-string">'sqlite'</span><span class="token punctuation">,</span> <span class="token comment">// 类型,支持 sqlte、mysql、pgsql 三种</span>
<span class="token string single-quoted-string">'dbname'</span> <span class="token operator">=&gt;</span> <span class="token string single-quoted-string">'a.db'</span><span class="token punctuation">,</span> <span class="token comment">// 当类型为 sqlite 时dbname 字段为 SQLite 数据库的文件名</span>
<span class="token string single-quoted-string">'pool_size'</span> <span class="token operator">=&gt;</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token comment">// 连接池大小防止协程冲突SQLite 也需要连接池)</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token string single-quoted-string">'default'</span> <span class="token operator">=&gt;</span> <span class="token punctuation">[</span>
<span class="token string single-quoted-string">'enable'</span> <span class="token operator">=&gt;</span> <span class="token constant boolean">false</span><span class="token punctuation">,</span>
<span class="token string single-quoted-string">'type'</span> <span class="token operator">=&gt;</span> <span class="token string single-quoted-string">'mysql'</span><span class="token punctuation">,</span>
<span class="token string single-quoted-string">'host'</span> <span class="token operator">=&gt;</span> <span class="token string single-quoted-string">'127.0.0.1'</span><span class="token punctuation">,</span> <span class="token comment">// 填写数据库服务器地址后才会创建数据库连接</span>
<span class="token string single-quoted-string">'port'</span> <span class="token operator">=&gt;</span> <span class="token number">3306</span><span class="token punctuation">,</span>
<span class="token string single-quoted-string">'username'</span> <span class="token operator">=&gt;</span> <span class="token string single-quoted-string">'root'</span><span class="token punctuation">,</span>
<span class="token string single-quoted-string">'password'</span> <span class="token operator">=&gt;</span> <span class="token string single-quoted-string">'ZhamaoTEST'</span><span class="token punctuation">,</span>
<span class="token string single-quoted-string">'dbname'</span> <span class="token operator">=&gt;</span> <span class="token string single-quoted-string">'zm'</span><span class="token punctuation">,</span>
<span class="token string single-quoted-string">'charset'</span> <span class="token operator">=&gt;</span> <span class="token string single-quoted-string">'utf8mb4'</span><span class="token punctuation">,</span>
<span class="token string single-quoted-string">'pool_size'</span> <span class="token operator">=&gt;</span> <span class="token number">64</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br></div></div><p>其中type 为 mysql 和 pgsql 时,需要设置 host、port、username、password、dbname 字段sqlite 时需要设置 dbname 字段。</p> <p>在设置了 enable 为 true 后,将创建对应数据库的连接池。在框架所有插件加载后启用前会创建连接池。</p> <h2 id="连接池模式"><a href="#连接池模式" class="header-anchor">#</a> 连接池模式</h2> <p>框架对于不同种类的 SQL 采用了统一的 wrapper 层,保证不同数据库调用时的接口尽可能相同。从连接池拿取对象很简单,通过方法 <code>db()</code></p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token comment">// 获取 default 名称的数据库连接</span>
<span class="token variable">$db</span> <span class="token operator">=</span> <span class="token function">db</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 获取对应名称的数据库连接,名称等于上方配置中的键名</span>
<span class="token variable">$sqlite</span> <span class="token operator">=</span> <span class="token function">db</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'sqlite_db1'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>返回的对象为 <code>DBWrapper</code> 对象。</p> <h2 id="便捷-sqlite-模式"><a href="#便捷-sqlite-模式" class="header-anchor">#</a> 便捷 SQLite 模式</h2> <p>对于 SQLite 数据库来说,使用连接池可能较为笨重,而且在开发者使用框架开发炸毛框架的插件分发时,可能需要使用 SQLite 数据库,但是又不想使用连接池。</p> <p>框架在 3.2.0 版本开始提供了便捷 SQLite 访问,无需任何配置,仅需 <code>zm_sqlite('dbname.db')</code> 方式即可创建和访问一个 SQLite 数据库。</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token comment">// 连接一个 SQLite 数据库,在相对路径下,文件会保存到 zm_data/db/ 目录</span>
<span class="token variable">$db</span> <span class="token operator">=</span> <span class="token function">zm_sqlite</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'a.db'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 连接一个 SQLite 数据库,可以是任意绝对路径</span>
<span class="token variable">$db</span> <span class="token operator">=</span> <span class="token function">zm_sqlite</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/home/zhamao/a.db'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 在连接 SQLite 文件时,如果设置了 create_new 参数为 False文件不存在时将会抛出异常</span>
<span class="token variable">$db</span> <span class="token operator">=</span> <span class="token function">zm_sqlite</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'a.db'</span><span class="token punctuation">,</span> <span class="token argument-name">create_new</span><span class="token punctuation">:</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 在连接 SQLite 文件时,如果设置了 keep_alive 参数为 False框架将不会缓存已经打开的 PDO 对象,而是每次都会重新打开。(默认为 True为了提升性能</span>
<span class="token variable">$db</span> <span class="token operator">=</span> <span class="token function">zm_sqlite</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'a.db'</span><span class="token punctuation">,</span> <span class="token argument-name">keep_alive</span><span class="token punctuation">:</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><p>返回的对象为 <code>DBWrapper</code> 对象。</p> <div class="custom-block tip"><p class="custom-block-title">提示</p> <p>无论是使用连接池的 <code>db()</code> 还是便捷 SQLite 模式的 <code>zm_sqlite()</code>,获取的都是 <code>DBWrapper</code> 对象,文档只是为了书写方便。
实际使用过程中如果要使用便捷 SQLite 模式只需将 <code>db</code> 替换为 <code>zm_sqlite</code> 即可。</p></div> <h3 id="执行预处理-sql-语句"><a href="#执行预处理-sql-语句" class="header-anchor">#</a> 执行预处理 SQL 语句</h3> <p>预处理查询很巧妙地解决了 SQL 注入问题,并且可以方便地绑定参数进行查询。</p> <p>预处理一般是指使用 <code>?</code> 占位符或 <code>:xxx</code> 命名标签进行参数留空,先处理 SQL 语句再填入数据。</p> <p>一般 <code>?</code> 具有前后位置性,例如如下的查询:</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$sql</span> <span class="token operator">=</span> <span class="token string double-quoted-string">&quot;SELECT * FROM users WHERE id = ? AND username = ?&quot;</span><span class="token punctuation">;</span>
<span class="token variable">$stmt</span> <span class="token operator">=</span> <span class="token function">db</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">getConnection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">prepare</span><span class="token punctuation">(</span><span class="token variable">$sql</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$stmt</span><span class="token operator">-&gt;</span><span class="token function">bindValue</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">&quot;1&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$stmt</span><span class="token operator">-&gt;</span><span class="token function">bindValue</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">&quot;jack&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$resultSet</span> <span class="token operator">=</span> <span class="token variable">$stmt</span><span class="token operator">-&gt;</span><span class="token function">executeQuery</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>其中 <code>$resultSet</code><code>Statement</code> 方法相似,此处的对象可能是 <a href="">数据库语句对象 - TODO</a> 或 数据库结果对象(结果对象与语句对象的 fetchXXX() 部分一致)。</p> <p>这里也可以使用命名标签,使用标签可以给相同参数处使用同一个标签:</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$sql</span> <span class="token operator">=</span> <span class="token string double-quoted-string">&quot;SELECT * FROM users WHERE gender = :name OR username = :name&quot;</span><span class="token punctuation">;</span>
<span class="token variable">$stmt</span> <span class="token operator">=</span> <span class="token function">db</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">getConnection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">prepare</span><span class="token punctuation">(</span><span class="token variable">$sql</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$stmt</span><span class="token operator">-&gt;</span><span class="token function">bindValue</span><span class="token punctuation">(</span><span class="token string double-quoted-string">&quot;name&quot;</span><span class="token punctuation">,</span> <span class="token string double-quoted-string">&quot;jack&quot;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$resultSet</span> <span class="token operator">=</span> <span class="token variable">$stmt</span><span class="token operator">-&gt;</span><span class="token function">executeQuery</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">dump</span><span class="token punctuation">(</span><span class="token variable">$resultSet</span><span class="token operator">-&gt;</span><span class="token function">fetchAllAssociative</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 返回多行数据,使用关联数组返回</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><h3 id="执行常规语句"><a href="#执行常规语句" class="header-anchor">#</a> 执行常规语句</h3> <p>执行常规语句为 statement 方式执行,此方法执行后只返回影响的行数,而不返回结果,适用于 UPDATE 等语句。</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$count</span> <span class="token operator">=</span> <span class="token function">db</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">executeStatement</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'UPDATE users SET username = ? WHERE id = ?'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'jwage'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token variable">$count</span><span class="token punctuation">;</span> <span class="token comment">// 1</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><h3 id="执行查询语句"><a href="#执行查询语句" class="header-anchor">#</a> 执行查询语句</h3> <p>为给定的 SQL 创建一个准备好的语句并将参数传递给 executeQuery 方法,然后返回结果集。此方法为上述的「预处理查询语句」的简化版,可直接在第二个参数使用 array 插入绑定参数执行。</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$resultSet</span> <span class="token operator">=</span> <span class="token function">db</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">executeQuery</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'SELECT * FROM user WHERE username = ?'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'jack'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token variable">$user</span> <span class="token operator">=</span> <span class="token variable">$resultSet</span><span class="token operator">-&gt;</span><span class="token function">fetchAssociative</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/* $user 值
array(
0 =&gt; array(
'id' =&gt; 1,
'username' =&gt; 'jack',
'gender' =&gt; 'man',
'update_time' =&gt; '2021-10-12'
)
)
*/</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><h2 id="助手函数"><a href="#助手函数" class="header-anchor">#</a> 助手函数</h2> <p>助手函数的意义在于简化 SQL 查询时调用过多次成员方法,达到一步就位的作用。</p> <h3 id="fetchallassociative"><a href="#fetchallassociative" class="header-anchor">#</a> fetchAllAssociative()</h3> <p>执行查询并将所有结果返回一个数组中。</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$resultSet</span> <span class="token operator">=</span> <span class="token function">db</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">fetchAllAssociative</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'SELECT * FROM user WHERE username = ?'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'jack'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 结果同 executeQuery()-&gt;fetchAllAssociative() 中 $user 的值。</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><h3 id="fetchallkeyvalue"><a href="#fetchallkeyvalue" class="header-anchor">#</a> fetchAllKeyValue()</h3> <p>执行查询并将前两列分别作为键和值提取到关联数组中。</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$resultSet</span> <span class="token operator">=</span> <span class="token function">db</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">fetchAllKeyValue</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'SELECT username, gender FROM user WHERE username = ?'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'jack'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/* $resultSet 值
array(
'jack' =&gt; 'man'
)
*/</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><h3 id="fetchallassociativeindexed"><a href="#fetchallassociativeindexed" class="header-anchor">#</a> fetchAllAssociativeIndexed()</h3> <p>执行查询并将数据作为关联数组获取,其中键代表第一列,值是其余列及其值的关联数组。</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$users</span> <span class="token operator">=</span> <span class="token function">db</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">fetchAllAssociativeIndexed</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'SELECT id, username, gender FROM users'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/*
array(
1 =&gt; array(
'username' =&gt; 'jack',
'gender' =&gt; 'man',
'update_time' =&gt; '2021-10-12'
)
)
*/</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><h3 id="fetchnumeric"><a href="#fetchnumeric" class="header-anchor">#</a> fetchNumeric()</h3> <p>查询并返回第一行数据,形式以数字索引方式返回每一列。</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$user</span> <span class="token operator">=</span> <span class="token function">db</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">fetchNumeric</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'SELECT * FROM users WHERE username = ?'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'jack'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/*
array(
0 =&gt; 'jwage',
1 =&gt; 'man',
2 =&gt; '2021-10-12'
)
*/</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><h3 id="fetchone"><a href="#fetchone" class="header-anchor">#</a> fetchOne()</h3> <p>仅返回查询结果的第一行第一列的值。</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$username</span> <span class="token operator">=</span> <span class="token function">db</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">fetchOne</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'SELECT username FROM users WHERE id = ?'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> <span class="token variable">$username</span><span class="token punctuation">;</span> <span class="token comment">// jack</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><h3 id="fetchassociative"><a href="#fetchassociative" class="header-anchor">#</a> fetchAssociative()</h3> <p>返回结果内第一行的关联数组形式的数据。</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$users</span> <span class="token operator">=</span> <span class="token function">db</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">fetchAssociative</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'SELECT * FROM users'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/*
array(
'id' =&gt; 1,
'username' =&gt; 'jack',
'gender' =&gt; 'man',
'update_time' =&gt; '2021-10-12'
)
*/</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div><h3 id="delete"><a href="#delete" class="header-anchor">#</a> delete()</h3> <p>删除查询操作,第一个参数为表名,第二个参数为 <code>['列名' =&gt; '列值']</code></p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token function">db</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">delete</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'username'</span> <span class="token operator">=&gt;</span> <span class="token string single-quoted-string">'jack'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 等同于执行DELETE FROM user WHERE username = ? ,参数列表为('jack')</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><h3 id="insert"><a href="#insert" class="header-anchor">#</a> insert()</h3> <p>插入数据库一行,第一个参数为表名,第二个参数为对应数据。</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token function">db</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'id'</span> <span class="token operator">=&gt;</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'username'</span> <span class="token operator">=&gt;</span> <span class="token string single-quoted-string">'jwage'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'gender'</span> <span class="token operator">=&gt;</span> <span class="token string single-quoted-string">'woman'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'update_time'</span> <span class="token operator">=&gt;</span> <span class="token string single-quoted-string">'2021-10-17'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// INSERT INTO user (id, username, gender, update_time) VALUES (?,?,?,?) (0,jwage,woman,2021-10-17)</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><h3 id="update"><a href="#update" class="header-anchor">#</a> update()</h3> <p>更新数据库,使用给定数据更新匹配键值标识符的所有行。</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$wrapper</span><span class="token operator">-&gt;</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'user'</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'username'</span> <span class="token operator">=&gt;</span> <span class="token string single-quoted-string">'jwage'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'id'</span> <span class="token operator">=&gt;</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// UPDATE user (username) VALUES (?) WHERE id = ? (jwage, 1)</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><h2 id="使用查询构造器"><a href="#使用查询构造器" class="header-anchor">#</a> 使用查询构造器</h2> <p>有时候并不愿意写 SQL 语句,那么你可以选择使用 SQL 查询构造器。</p> <blockquote><p>此处由 <a href="https://www.doctrine-project.org/projects/doctrine-dbal/en/2.13/reference/query-builder.html#sql-query-builder" target="_blank" rel="noopener noreferrer">Doctrine 原英文文档<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> 翻译而来,如有不正确,可看原文档。</p></blockquote> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$resultSet</span> <span class="token operator">=</span> <span class="token function">sql_builder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'username'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'gender'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users'</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'username = ?'</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">setParameter</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'jack'</span><span class="token punctuation">)</span><span class="token operator">-&gt;</span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h3 id="获取-sql-builder"><a href="#获取-sql-builder" class="header-anchor">#</a> 获取 SQL Builder</h3> <p>连接池的访问模式,使用全局函数 <code>sql_builder()</code> 即可。便捷 SQLite 模式,使用全局函数 <code>zm_sqlite_builder()</code> 即可。</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token comment">// 获取 default 名称的数据库连接的 builder</span>
<span class="token variable">$queryBuilder</span> <span class="token operator">=</span> <span class="token function">sql_builder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 获取对应名称的数据库连接的 builder名称等于上方配置中的键名</span>
<span class="token variable">$queryBuilder</span> <span class="token operator">=</span> <span class="token function">sql_builder</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'sqlite_db1'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 使用便捷 SQLite 模式获取 builder</span>
<span class="token variable">$queryBuilder</span> <span class="token operator">=</span> <span class="token function">zm_sqlite_builder</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'mydb.db'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 在使用便捷 SQLite 模式时,也可以传入 create_new 参数和 keep_alive 参数</span>
<span class="token variable">$queryBuilder</span> <span class="token operator">=</span> <span class="token function">zm_sqlite_builder</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/home/a/d.db'</span><span class="token punctuation">,</span> <span class="token argument-name">create_new</span><span class="token punctuation">:</span> <span class="token constant boolean">false</span><span class="token punctuation">,</span> <span class="token argument-name">keep_alive</span><span class="token punctuation">:</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><h3 id="构建一个普通查询"><a href="#构建一个普通查询" class="header-anchor">#</a> 构建一个普通查询</h3> <p>sql_builder 支持构建 INSERT、UPDATE、SELECT、DELETE 类型的查询语句,具体构造内容取决于你调用的方法。</p> <p>对于 INSERT、UPDATE、DELETE 查询,你可以传入表名。</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$queryBuilder</span>
<span class="token operator">-&gt;</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users'</span><span class="token punctuation">)</span>
<span class="token punctuation">;</span>
<span class="token variable">$queryBuilder</span>
<span class="token operator">-&gt;</span><span class="token function">update</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users'</span><span class="token punctuation">)</span>
<span class="token punctuation">;</span>
<span class="token variable">$queryBuilder</span>
<span class="token operator">-&gt;</span><span class="token function">delete</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users'</span><span class="token punctuation">)</span>
<span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><p>你可以随时调用 <code>getSQL()</code> 方法获取当前状态下构造的 SQL 语句。</p> <h3 id="distinct-仅选择不同的值"><a href="#distinct-仅选择不同的值" class="header-anchor">#</a> DISTINCT 仅选择不同的值</h3> <p>如果你在使用查询器时,在 SELECT 模式下,可以使用 distinct 方法筛选独特的值列表:</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$queryBuilder</span>
<span class="token operator">-&gt;</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'name'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">distinct</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users'</span><span class="token punctuation">)</span>
<span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><h3 id="where-限定查询范围"><a href="#where-限定查询范围" class="header-anchor">#</a> WHERE 限定查询范围</h3> <p>在 SELECT、UPDATE、DELETE 查询模式下,可以使用 where 方法限定选择条件:</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$queryBuilder</span>
<span class="token operator">-&gt;</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'id'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'name'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'email = ?'</span><span class="token punctuation">)</span>
<span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><blockquote><p>当调用 <code>where()</code> 后将会清除先前通过 <code>andWhere()</code><code>orWhere()</code> 添加的 WHERE 条件,所以你应该先使用 <code>where()</code>,再使用 <code>andWhere()</code><code>orWhere()</code> 等条件限定方法。</p></blockquote> <h3 id="表别名"><a href="#表别名" class="header-anchor">#</a> 表别名</h3> <p>基于 SQL 语法:<code>SELECT u.id, u.name FROM users AS u</code>,你可以使用 <code>from()</code> 方法指定表的别名:</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$queryBuilder</span>
<span class="token operator">-&gt;</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'u.id'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'u.name'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'u'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'u.email = ?'</span><span class="token punctuation">)</span>
<span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><h3 id="使用-group-by-和-having-语句"><a href="#使用-group-by-和-having-语句" class="header-anchor">#</a> 使用 GROUP BY 和 HAVING 语句</h3> <p>SELECT 查询下,你可以使用 <code>having()</code><code>groupBy()</code> 等方法来代表 <code>GROUP_BY</code><code>HAVING</code> 等查询语法。
你也可以在使用 <code>where()</code> 限定查询条件时与 <code>andHaving()</code><code>orHaving()</code> 等方式组合谓语。</p> <p>对于 <code>GROUP BY</code> 语法,你可以使用 <code>groupBy()</code> 方法来指定:</p> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$queryBuilder</span>
<span class="token operator">-&gt;</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'DATE(last_login) as date'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'COUNT(id) AS users'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">groupBy</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'DATE(last_login)'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">having</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users &gt; 10'</span><span class="token punctuation">)</span>
<span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><h3 id="join-语句"><a href="#join-语句" class="header-anchor">#</a> Join 语句</h3> <p>SELECT 查询下,你可以生成多种不同的 JOIN 查询语句INNER、LEFT、RIGHT。需要注意的是RIGHT 的 JOIN 方式可能不适用于所有平台,例如 SQLite。</p> <p>一个 JOIN 语句必须是 FROM 语句的一部分,这块学过 SQL 的人应该都知道怎么用,但我实在不会翻译了,翻译软件是个废物,贴上来原文:</p> <blockquote><p>A join always belongs to one part of the from clause. This is why you have to specify the alias of the FROM part the join belongs to as the first argument.</p> <p>As a second and third argument you can then specify the name and alias of the join-table and the fourth argument contains the ON clause.</p></blockquote> <div class="language-php line-numbers-mode"><pre class="language-php"><code><span class="token variable">$queryBuilder</span>
<span class="token operator">-&gt;</span><span class="token function">select</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'u.id'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'u.name'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'p.number'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'users'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'u'</span><span class="token punctuation">)</span>
<span class="token operator">-&gt;</span><span class="token function">innerJoin</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'u'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'phonenumbers'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'p'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'u.id = p.user_id'</span><span class="token punctuation">)</span>
<span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><div class="custom-block tip"><p class="custom-block-title">提示</p> <p>TODO我还没翻译完东西挺多的如果着急看这部分内容的话可以先看 <a href="https://www.doctrine-project.org/projects/doctrine-dbal/en/2.13/reference/query-builder.html#sql-query-builder" target="_blank" rel="noopener noreferrer">原文<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></p></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/zhamao-robot/zhamao-framework/edit/main/docs/components/store/mysql.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev"><a href="/components/store/redis.html" class="prev"><i aria-label="icon: left" class="anticon anticon-left"><svg viewBox="64 64 896 896" focusable="false" data-icon="left" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M724 218.3V141c0-6.7-7.7-10.4-12.9-6.3L260.3 486.8a31.86 31.86 0 0 0 0 50.3l450.8 352.1c5.3 4.1 12.9.4 12.9-6.3v-77.3c0-4.9-2.3-9.6-6.1-12.6l-360-281 360-281.1c3.8-3 6.1-7.7 6.1-12.6z"></path></svg></i>
Redis 数据库
</a></span> <span class="next"><a href="/components/container/dependency-injection.html">
依赖注入
<i aria-label="icon: right" class="anticon anticon-right"><svg viewBox="64 64 896 896" focusable="false" data-icon="right" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M765.7 486.8L314.9 134.7A7.97 7.97 0 0 0 302 141v77.3c0 4.9 2.3 9.6 6.1 12.6l360 281.1-360 281.1c-3.9 3-6.1 7.7-6.1 12.6V883c0 6.7 7.7 10.4 12.9 6.3l450.8-352.1a31.96 31.96 0 0 0 0-50.4z"></path></svg></i></a></span></p></div> <div class="page-anchor"><div class="ant-space ant-space-vertical" style="width:100%;"><div class="ant-space-item"><div class="page-anchor-offset"><div><div class="ant-anchor-wrapper" style="max-height:100vh;"><div class="ant-anchor"><div class="ant-anchor-ink"><span class="ant-anchor-ink-ball"></span></div><div class="ant-anchor-link"><a href="#简介" title="简介" class="ant-anchor-link-title">简介</a></div><div class="ant-anchor-link"><a href="#连接池" title="连接池" class="ant-anchor-link-title">连接池</a></div><div class="ant-anchor-link"><a href="#连接池模式" title="连接池模式" class="ant-anchor-link-title">连接池模式</a></div><div class="ant-anchor-link"><a href="#便捷-sqlite-模式" title="便捷 SQLite 模式" class="ant-anchor-link-title">便捷 SQLite 模式</a><div class="ant-anchor-link"><a href="#执行预处理-sql-语句" title="执行预处理 SQL 语句" class="ant-anchor-link-title">执行预处理 SQL 语句</a></div><div class="ant-anchor-link"><a href="#执行常规语句" title="执行常规语句" class="ant-anchor-link-title">执行常规语句</a></div><div class="ant-anchor-link"><a href="#执行查询语句" title="执行查询语句" class="ant-anchor-link-title">执行查询语句</a></div></div><div class="ant-anchor-link"><a href="#助手函数" title="助手函数" class="ant-anchor-link-title">助手函数</a><div class="ant-anchor-link"><a href="#fetchallassociative" title="fetchAllAssociative()" class="ant-anchor-link-title">fetchAllAssociative()</a></div><div class="ant-anchor-link"><a href="#fetchallkeyvalue" title="fetchAllKeyValue()" class="ant-anchor-link-title">fetchAllKeyValue()</a></div><div class="ant-anchor-link"><a href="#fetchallassociativeindexed" title="fetchAllAssociativeIndexed()" class="ant-anchor-link-title">fetchAllAssociativeIndexed()</a></div><div class="ant-anchor-link"><a href="#fetchnumeric" title="fetchNumeric()" class="ant-anchor-link-title">fetchNumeric()</a></div><div class="ant-anchor-link"><a href="#fetchone" title="fetchOne()" class="ant-anchor-link-title">fetchOne()</a></div><div class="ant-anchor-link"><a href="#fetchassociative" title="fetchAssociative()" class="ant-anchor-link-title">fetchAssociative()</a></div><div class="ant-anchor-link"><a href="#delete" title="delete()" class="ant-anchor-link-title">delete()</a></div><div class="ant-anchor-link"><a href="#insert" title="insert()" class="ant-anchor-link-title">insert()</a></div><div class="ant-anchor-link"><a href="#update" title="update()" class="ant-anchor-link-title">update()</a></div></div><div class="ant-anchor-link"><a href="#使用查询构造器" title="使用查询构造器" class="ant-anchor-link-title">使用查询构造器</a><div class="ant-anchor-link"><a href="#获取-sql-builder" title="获取 SQL Builder" class="ant-anchor-link-title">获取 SQL Builder</a></div><div class="ant-anchor-link"><a href="#构建一个普通查询" title="构建一个普通查询" class="ant-anchor-link-title">构建一个普通查询</a></div><div class="ant-anchor-link"><a href="#distinct-仅选择不同的值" title="DISTINCT 仅选择不同的值" class="ant-anchor-link-title">DISTINCT 仅选择不同的值</a></div><div class="ant-anchor-link"><a href="#where-限定查询范围" title="WHERE 限定查询范围" class="ant-anchor-link-title">WHERE 限定查询范围</a></div><div class="ant-anchor-link"><a href="#表别名" title="表别名" class="ant-anchor-link-title">表别名</a></div><div class="ant-anchor-link"><a href="#使用-group-by-和-having-语句" title="使用 GROUP BY 和 HAVING 语句" class="ant-anchor-link-title">使用 GROUP BY 和 HAVING 语句</a></div><div class="ant-anchor-link"><a href="#join-语句" title="Join 语句" class="ant-anchor-link-title">Join 语句</a></div></div></div></div></div></div></div></div></div> </main> <!----></div><div class="global-ui"></div></div>
<script src="/assets/js/app.cf958133.js" defer></script><script src="/assets/js/2.4c04991c.js" defer></script><script src="/assets/js/1.d8755a39.js" defer></script><script src="/assets/js/43.5ee83631.js" defer></script>
</body>
</html>