<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智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ### 2018 年 11 月 22 日 發布 >[danger] 今天是感恩節,首先感謝所有關注和使用`ThinkPHP`的用戶,尤其要對那些為框架做過貢獻的用戶說聲感恩,因為有你們的大力支持,`ThinkPHP`才能堅持到今天還在不斷更新完善,我也還能寫下這篇博客。 本文給大家不完全的整理了一些能夠提高開發效率的查詢技巧,希望能給你的開發工作帶來更多的方便,不過也許有些技巧可能你已經了然于胸了,就當鞏固學習了。 >[info] 本文中所有的查詢示例都以模型用法為例,只為為了進一步說明所有的查詢構造器用法都適用于模型。 ## 查詢值為Null的數據 ``` // 查詢email為空,并且name不為空的用戶數據 User::whereNull('email') ->whereNotNull('name') ->select(); ``` ## 多個字段同一個查詢條件 快捷查詢方式是一種多字段相同查詢條件的簡化寫法,可以進一步簡化查詢條件的寫法,在多個字段之間用`|`分割表示`OR`查詢,用`&`分割表示`AND`查詢,例如: ``` User::where('name|title','like','thinkphp%') ->where('create_time&update_time','>',0) ->find(); ``` ## 數組對象查詢 如果你升級老版本的系統到`5.1`,由于數組查詢方式的變化,而你又不希望全部換成表達式查詢,那么可以使用數組對象查詢。 ``` use think\db\Where; // 5.0的數組查詢條件 $map = [ 'name' => ['like', 'thinkphp%'], 'title' => ['like', '%think%'], 'id' => ['>', 10], 'status' => 1, ]; User::where(new Where($map)) ->select(); ``` 只需要把原來的 ``` where($map) ``` 改成 ``` where(new Where($map)) ``` 即可完成簡單的數組查詢升級兼容。 ## 使用快捷方法 對于一些常用的查詢,系統封裝了快捷查詢方法,例如: ``` User::whereIn('id', [1,2,3]) ->whereLike('name', 'think%') ->select(); ``` 相當于下面的查詢 ``` User::where('id', 'in', [1,2,3]) ->where('name', 'like', 'think%') ->select(); ``` 更多的方法可以參考官方手冊或者使用IDE的自動提示。 ## 獲取字段值和列數據 對于一些簡單的數據獲取,你完全不需要查詢整個表的數據,例如查詢某個字段(滿足條件的)值或者列數據。 ``` // 獲取id為10的用戶名稱 User::where('id', 10) ->value('name'); // 獲取狀態為1的用戶名稱列表 User::where('status', 1) ->column('name'); // 獲取分數大于80的用戶分數列表,以用戶ID為索引 User::where('score', '>', 80) ->column('score', 'id'); ``` ## 聚合查詢 可以直接進行各種聚合查詢,包括: ``` User::count(); User::max('score'); User::min('score'); User::avg('score'); Blog::sum('read_count'); ``` 如果你的`min`/`max`查詢的是一個字符串類型字段,記得加上第二個參數。 ``` // 獲取name字段的最大值 User::max('name', false); ``` ## 時間區間查詢 時間查詢主要用于時間字段的區間查詢,支持所有類型的時間字段。 ``` // 大于某個時間 User::whereTime('birthday', '>=', '2008-10-1') ->select(); // 小于某個時間 User::whereTime('birthday', '<', '2000-10-1') ->select(); // 時間區間查詢 User::whereBetweenTime('birthday', '1990-10-1', '2000-10-1') ->select(); // 不在某個時間區間 User::whereNotBetweenTime('birthday', '1970-10-1', '2000-10-1') ->select(); ``` 如果`whereBetweenTime`方法沒有指定第三個參數,則表示查詢當天的數據 ``` // 查詢2000年10月1日出生的用戶 User::whereBetweenTime('birthday', '2000-10-1') ->select(); ``` ## 時間表達式查詢 對于一些非具體的時間查詢,比較適合使用時間表達式進行查詢,例如: ``` // 獲取今天的博客 Blog::whereTime('create_time', 'today') ->select(); // 獲取昨天的博客 Blog::whereTime('create_time', 'yesterday') ->select(); // 獲取本周的博客 Blog::whereTime('create_time', 'week') ->select(); // 獲取上周的博客 Blog::whereTime('create_time', 'last week') ->select(); // 獲取本月的博客 Blog::whereTime('create_time', 'month') ->select(); // 獲取上月的博客 Blog::whereTime('create_time', 'last month') ->select(); // 獲取今年的博客 Blog::whereTime('create_time', 'year') ->select(); // 獲取去年的博客 Blog::whereTime('create_time', 'last year') ->select(); ``` 高級的時間表達式查詢可以使用PHP的[相對時間格式](http://php.net/manual/zh/datetime.formats.relative.php),例如: ``` // 查詢兩天以內的博客 Blog::whereTime('create_time','-2 days') ->select(); // 查詢昨天中午后發的博客 Blog::whereTime('create_time','yesterday noon') ->select(); ``` 更多的時間表達式查詢你可以自由發揮。 ## 時間字段范圍查詢 你可以查詢當前時間是否在兩個時間字段區間范圍內,通常用于一些活動以及優惠券的有效期查詢等等。 ``` // 查詢有效期內的活動 Event::whereBetweenTimeField('start_time','end_time') ->select(); // 查詢沒有開始或者已經過期的活動 Event::whereNotBetweenTimeField('start_time','end_time') ->select(); ``` ## 字段比較 可以直接比較兩個字段的大小進行查詢 ``` User::whereColumn('update_time', '>', 'create_time') ->select(); User::whereColumn('score1', '>', 'score2') ->select(); ``` 如果需要比較兩個字段相同,可以使用 ``` User::whereColumn('score1', 'score2') ->select(); ``` ## 動態查詢 使用動態查詢可以進一步簡化你的查詢條件,不過缺點是可能無法做到IDE的自動提示了,例如: ``` // 根據郵箱(email)查詢用戶信息 User::whereEmail('thinkphp@qq.com') ->find(); // 根據昵稱(nick_name)查詢用戶 User::whereNickName('like', '%流年%') ->select(); // 根據郵箱查詢用戶信息 User::getByEmail('thinkphp@qq.com'); // 根據昵稱(nick_name)查詢用戶信息 User::getByNickName('流年'); // 根據郵箱查詢用戶的昵稱 User::getFieldByEmail('thinkphp@qq.com', 'nick_name'); // 根據昵稱(nick_name)查詢用戶郵箱 User::getFieldByNickName('流年', 'email'); ``` ## 條件查詢 利用條件查詢你可以很方便的控制查詢條件分支,你再也不需要在組裝查詢條件的時候寫大量的`if`和`else`了。 ``` User::when($condition, function ($query) { // 滿足條件后執行 $query->where('score', '>', 80)->limit(10); })->select(); ``` 并且支持不滿足條件的分支查詢,并且支持多次調用`when`方法。 ``` User::when($condition, function ($query) { // 滿足條件后執行 $query->where('score', '>', 80)->limit(10); }, function ($query) { // 不滿足條件執行 $query->where('score', '>', 60); }); ``` ## JSON查詢 如果你的字段類型使用的是JSON類型,那么可以直接使用框架提供的JSON查詢支持。 ``` User::where('info->nickname', 'ThinkPHP') ->find(); ``` 注意,需要在模型里面定義`JSON`字段屬性。 ``` <?php namespace app\index\model; use think\Model; class User extends Model { // 設置json類型字段 protected $json = ['info']; } ``` 如果使用Db查詢的話,可以改為 ``` $user = Db::name('user') ->json(['info']) ->where('info->nickname','ThinkPHP') ->find(); ``` ## SQL函數查詢 如果需要對某個字段使用SQL函數表達式查詢,可以使用 ``` User::whereExp('nickname', "= CONCAT(name, '-', id)") ->whereRaw('LEFT(nickname, 5) = ?', ['think']) ->select(); ``` 注意`whereExp`和`whereRaw`方法的區別,前者是對某個字段使用SQL函數表達式,后者是整個查詢就是一個SQL函數表達式。 ## 字段遞增/遞減 單獨對某個字段進行遞增/遞減操作,可以用: ``` // score 字段加 1 User::where('id', 1) ->setInc('score'); // score 字段加 5 User::where('id', 1) ->setInc('score', 5); // score 字段減 1 User::where('id', 1) ->setDec('score'); // score 字段減 5 User::where('id', 1) ->setDec('score', 5); ``` 可以支持延時更新 ``` // 延時30秒更新score字段 User::where('id', 1)->setInc('score', 1, 30); ``` 如果需要同時遞增/遞減多個字段的話,可以使用: ``` // 博客的閱讀數遞增1 評論數遞減2 Blog::where('id', 10) ->inc('read_count') ->dec('comment_count', 2) ->update(); ``` ## 指定字段值排序 如果你需要按照指定字段的值的順序來排序,可以使用 ``` User::where('status', 1) ->orderField('id', [1,2,3]) ->select(); ``` ## 從主庫讀取 如果你使用了數據庫的主從分離,當剛寫入數據后,數據庫的主從同步可能還沒來得及同步,這個時候立刻查詢數據可能會出錯,你可以使用下面的方法從主庫讀取。 ``` $user = User::create($data); $user->readMaster()->select(); ``` 你可以全局配置數據寫入后自動讀取主庫 ``` // 模型寫入后自動讀取主服務器 'read_master' => true, ``` ## 獲取自增ID 使用`Db`類的`insert`方法或者模型的`save`方法返回的不是自增主鍵,不過你可以使用。 ``` $userId = Db::name('user')->insertGetId($data); ``` 如果使用模型的話,自增主鍵的值會自動賦值給模型對象,可以直接獲取。 ``` $user = User::create($data); echo $user->id; ``` ## 模型查詢為空的處理 模型查詢數據不存在的話返回值為Null,所以必須要添加返回值判斷然后進行數據處理,如果你不想手動判斷,可以使用下面的方法查詢,如果數據不存在則返回空的模型對象。 ``` // 始終返回模型對象 $user = User::where('id', 10)->findOrEmpty(); ``` ## 自動分批寫入 如果你需要一次寫入大量數據,建議使用`limit`方法自動分批多次寫入。 ``` // 自動分批多次寫入數據庫 每次最多寫入1000條 Db::name('user') ->limit(1000) ->insertAll($dataList); ``` 如果是使用模型的話,建議直接使用`saveAll`方法而不需要`limit`方法。 ``` $user = new User; $user->saveAll($dataList); ``` ## 數據分批處理 對于大量數據的處理操作,可以使用`chunk`分批處理方法。 ``` // 每次處理100個數據 User::chunk(100, function($users) { foreach ($users as $user) { // 處理數據 } }); ``` ## 游標查詢 對于內存開銷比較大的應用,在做大量數據查詢和處理的時候,使用`cursor`方法進行游標查詢,可以利用PHP的生成器特性,減少內存占用。 ``` $cursor = User::cursor(); foreach($cursor as $user){ // 處理數據 } ``` ## 總結 善于運用查詢構造器封裝的快捷方法,可以大大提高開發效率,讓你更專注于業務邏輯,而不是怎么寫查詢代碼。 另外模型的很多功能都是為了提高開發效率而設計的,這里涉及太多的技巧,就不再一一描述了,以后專門來講吧。
                  <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>

                              哎呀哎呀视频在线观看