<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## `Mix\Database\PDOConnection` 組件 該組件用于 MySQL 等關系型數據庫的操作,語法簡單明了,且具有獨特的查詢構造方式,可構造任何復雜的SQL。 >[success] 該組件基于 PDO 擴展,[語句預處理](http://php.net/manual/zh/pdo.prepared-statements.php) 將幫助你免于SQL注入攻擊。 | 類 | 調用 | 連接方式 | | --- | --- | --- | | Mix\Database\PDOConnection | app()->db | 短連接 | ## 使用方法 ### 獲取連接 - 同步模式 ``` $db = app()->db; ``` - 協程模式 > 通過連接池組件獲取。 ``` $db = app()->dbPool->getConnection(); $db->release(); // 不手動釋放的連接不會歸還連接池,會在析構時丟棄 ``` ### 插入 ~~~ $data = [ 'name' => 'xiaoliu', 'content' => 'hahahaha', ]; $success = $db->insert('post', $data)->execute(); // 獲得剛插入數據的id $insertId = $db->getLastInsertId(); ~~~ ### 批量插入 ~~~ $data = [ ['name' => 'xiaoliu', 'content' => 'hahahaha'], ['name' => 'xiaoliu', 'content' => 'hahahaha'], ['name' => 'xiaoliu', 'content' => 'hahahaha'], ['name' => 'xiaoliu', 'content' => 'hahahaha'], ]; $success = $db->batchInsert('post', $data)->execute(); // 獲得受影響的行數 $affectedRows = $db->getRowCount(); ~~~ ### 更新 常規更新: ~~~ $set = [ 'num' => 2, 'name' => 'xiaoliu2', ]; $where = [ ['id', '=', 23], ]; $success = $db->update('post', $set, $where)->execute(); // 獲得受影響的行數 $affectedRows = $db->getRowCount(); ~~~ >[success] mix-database >= v2.0.2 更新 / 刪除可支持 where 的各種 OR / AND / IN / NOT IN / BETWEEN / NOT BETWEEN 組合,與 QueryBuilder 使用方式相同,如:$where = [['id', '=', 1], ['or', ['id', '=', 2]]]; 自增、自減: ~~~ $set = [ 'num' => ['+', 2], 'num1' => ['-', 1], ]; $where = [ ['id', '=', 23], ]; $success = $db->update('post', $set, $where)->execute(); // 獲得受影響的行數 $affectedRows = $db->getRowCount(); ~~~ ### 刪除 ~~~ $where = [ ['id', '=', 23], ]; $success = $db->delete('post', $where)->execute(); // 獲得受影響的行數 $affectedRows = $db->getRowCount(); ~~~ ### 查詢 >[danger] mix-database >= v2.0.4 開始 `createCommand `方法修改為更短的 `prepare`,在 < v2.1 框架會保留兼容性。 #### 執行原生 `SQL` >[info] 請不要直接把參數拼接在 SQL 內執行,帶參數的 SQL 請使用參數綁定。 ~~~ $rows = $db->prepare("SELECT * FROM `post`")->queryAll(); ~~~ #### 參數綁定 普通參數綁定: ~~~ $sql = "SELECT * FROM `post` WHERE id = :id AND name = :name"; $rows = $db->prepare($sql)->bindParams([ 'id' => 28, 'name' => 'xiaoliu', ])->queryOne(); ~~~ `IN`、`NOT IN` 數組參數綁定: > `PDO` 擴展是不支持綁定數組參數的,所以 WHERE IN 都只能直接 `implode(', ',$array)` 拼接到 SQL 里面,MixPHP 幫你做了這一步,所以只需像下面這樣使用。 ~~~ $sql = "SELECT * FROM `post` WHERE id IN (:id)"; $rows = $db->prepare($sql)->bindParams([ 'id' => [28, 29, 30], ])->queryAll(); ~~~ #### 查詢組合 >[success] mix-database >= v2.0.2 可使用 QueryBuilder 替代該功能處理常用 SQL 的生成,而只在復雜 SQL 時使用該方法。 MixPHP 推崇原生 SQL 查詢數據庫,但由于原生 SQL 在動態 Where 時,做參數綁定會導致邏輯有些復雜,所以 MixPHP 封裝了一個查詢組合的功能,方便動態控制 Where 與 自動參數綁定。 用戶可將整個 SQL 拆分為多個部分,每個部分可選擇使用下例兩個參數: - `params` 字段內的值會綁定到對應的sql中。 - `if` 字段的值為 false 時,該段 SQL 會丟棄。 常用查詢組合: ~~~ $rows = $db->prepare([ ['SELECT * FROM `post`'], ['WHERE id = :id AND name = :name ORDER BY id ASC', 'params' => [ 'id' => $this->id, 'name' => $this->name, ], ], ])->queryAll(); ~~~ 動態 Where 查詢組合: ~~~ $rows = $db->prepare([ ['SELECT * FROM `post` WHERE 1 = 1'], ['AND id = :id', 'params' => ['id' => $this->id], 'if' => isset($this->id)], ['AND name = :name', 'params' => ['name' => $this->name], 'if' => isset($this->name)], ['ORDER BY `post`.id ASC'], ])->queryAll(); ~~~ >[info] WHERE 1 = 1 是一個小技巧,能避免沒有 Where 時 SQL 錯誤的情況出現。 更復雜的查詢組合,包含了: - 動態 Join - 動態 Where - 分頁 ~~~ $rows = $db->prepare([ ['SELECT *'], ['FROM `post`'], [ 'INNER JOIN `user` ON `user`.id = `post`.id', 'if' => isset($this->name), ], ['WHERE 1 = 1'], [ 'AND `post`.id = :id', 'params' => ['id' => $this->id], 'if' => isset($this->id), ], [ 'AND `user`.name = :name', 'params' => ['name' => $this->name], 'if' => isset($this->name), ], ['ORDER BY `post`.id ASC'], ['LIMIT :offset, :rows', 'params' => ['offset' => ($this->currentPage - 1) * $this->perPage, 'rows' => $this->perPage]], ])->queryAll(); ~~~ ### 使用 MySQL 函數、存儲過程 ``` $db = $db; $ret = $db->prepare('select :uuid')->bindParams([ 'uuid' => $db::raw('uuid()'), ])->queryAll(); $ret = $db->batchInsert('test', [ ['text' => 'aaa', 'created_at' => $db::raw('CURRENT_TIMESTAMP()'), 'uuid' => $db::raw('uuid()')], ['text' => 'bbb', 'created_at' => $db::raw('CURRENT_TIMESTAMP()'), 'uuid' => $db::raw('uuid()')], ])->execute(); ``` ### 查詢返回結果集 返回多行,每行都是列名和值的關聯數組。 > 沒有結果返回空數組。 ~~~ $rows = $db->prepare("SELECT * FROM `post`")->queryAll(); ~~~ 返回一行 (第一行)。 > 沒有結果返回 false。 ~~~ $row = $db->prepare("SELECT * FROM `post` WHERE id = 28")->queryOne(); ~~~ 返回一列。 > 沒有結果返回空數組。 ~~~ // 第一列 $titles = $db->prepare("SELECT title FROM `post`")->queryColumn(); // 第二列 $titles = $db->prepare("SELECT * FROM `post`")->queryColumn(1); ~~~ 返回一個標量值。 > 如果該查詢沒有結果則返回 false。 ~~~ $count = $db->prepare("SELECT COUNT(*) FROM `post`")->queryScalar(); ~~~ 返回一個原生結果集 `PDOStatement` 對象。 > 通常在查詢大量結果時,為了避免內存溢出時使用。 ~~~ $statement = $db->prepare("SELECT * FROM `post`")->query(); while ($item = $statement->fetch()) { var_dump($item); } ~~~ ### 返回 SQL 語句 `PDO` 擴展是無法獲取最近執行的 SQL 的,所以這個功能是 MixPHP 通過參數構建出來的,這個在調試時是非常好用的功能。 ~~~ // 最新用法 $sql = $db->getLastSql(); // mix-database < v2.0.4 (在v2.1將只支持上面的用法) $sql = $db->getRawSql(); ~~~ ### 返回 SQL 日志 返回一個數組,包含 sql, bindings, time 三個字段。 ~~~ // mix-database >= v2.0.4 $sql = $db->getLastLog(); ~~~ ### 事務 手動事務: ~~~ $db->beginTransaction(); try { $db->insert('test', [ 'text' => '測試測試', ])->execute(); $db->commit(); } catch (\Exception $e) { $db->rollback(); throw $e; } ~~~ 自動事務:等同于上面的手動事務。 ~~~ $db->transaction(function () { $db->insert('test', [ 'text' => '測試測試', ])->execute(); }); ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看