某些狀況下咱們並不須要啓用比較重的AR去操做數據庫,這裏Yii2也爲咱們提供了sql
yii\db\Query 查詢構造器 只能建立 查詢 命令數據庫
yii\db\Command sql命令工具 能夠建立 curd 操做app
兩個工具類來知足此類需求,還有個 yii\db\QueryBuilder 感受用起來有些彆扭,感興趣的本身去看吧yii
查詢構造器能夠比較靈活的構建出各類查詢命令(不過我以爲靈活是對不太熟悉sql的人來講,由於我比較喜歡寫sql,因此我沒以爲有多靈活....但Yii2總歸仍是很不錯的)ide
$query = new \yii\db\Query(); $query->select(['`user`.`id`', '`user`.`username`, `order`.`info`']) ->distinct(false) ->from('{{%_user}} as `user`') ->leftJoin(['order' => '{{%_order}}'], '`order`.`uid` = `user`.`id`') ->where(['or', ['>=', '`user`.`id`', 20], ['<=', '`user`.`id`', 10]]) ->andWhere(['not', ['`user`.`username`' => null]]) ->orWhere(['>=', 'char_length(`user`.`username`)', 10]) ->andFilterWhere(['`user`.`name`' => '']) ->orFilterWhere(['`user`.`name`' => '']) ->groupBy('`user`.`id`') ->addGroupBy('`user`.`username`') ->having(['>', 'count(`user`.`id`)', 0]) ->andHaving(['>', 'count(`user`.`username`)', 0]) ->orderBy(['`user`.`id`' => SORT_DESC]) ->addOrderBy(['`user`.`username`' => SORT_ASC]) ->limit(10) ->offset(0);
經常使用的方法來一坨,更多的你們去看手冊就好,這裏須要說起的有工具
distinct 默認爲false 我寫出來讓你們看而已ui
where / andWhere / orWhere是普通的條件構造方法spa
andFilterWhere / orFilterWhere 我很喜歡 自動過濾值爲空的條件,上面我寫的這倆貨是不會生成到sql語句中取的,值爲空直接被過濾丟棄code
其餘的 groupBy having 或者 orderBy 的追加方式 addGroupBy andHaving addOrderBy 就能夠看出有的查詢條件是能夠追加成員的,而有的是並行條件的token
條件組裝完了咱們就能夠調用 all() one() column() scaler() max() min() average() 什麼的去檢索結果了了
固然也可使用 yii\db\Query::createCommand($db=null) 來生成 yii\db\Command 的實例
yii\db\Command 能夠直接執行原生的 sql 語句,也能夠經過 yii\db\Connection yii\db\Query的實例經過 createCommand 方法來生成本身的一個實例,其自身能夠執行 curd 操做,咱們能夠經過原生的 sql 去生成查詢器,也能夠經過他自身的方法去構建,最後使用 queryAll() queryOne() queryScaler() 等方法能夠進行檢索,execute()方法用來執行沒有返回結果的命令
//當前數據庫鏈接 $db = Yii::$app->db; //生成命令查詢器 這裏其實能夠直接根據 sql 進行構造 $command = $db->createCommand(); //單條插入 $command->insert('{{%_user}}', [ 'username' => 'sallency', 'password' => '123456', 'auth_key' => md5('123456'), 'access_token' => md5('123456') ]); $result_insert = $command->execute(); //批量插入 $command->batchInsert('{{%_user}}', ['username', 'password', 'auth_key', 'access_token'], [ ['james', 'james@yii', md5('james@yii'), md5('james@yii')], ['jack', 'jack@yii', md5('jack@yii'), md5('jack@yii')], ['lucy', 'lucy@yii', md5('lucy@yii'), md5('lucy@yii')], ['lily', 'lily@yii', md5('lily@yii'), md5('lily@yii')] ]); $result_batch_insert = $command->execute(); //清空表 $command->truncateTable('{{%_order}}'); $command->execute(); $command->batchInsert('{{%_order}}', ['uid', 'info'], [ [1, 'apple 25g'], [2, 'orange 25g'], [3, 'banana 25g'], [3, 'pear 25g'], [4, 'orange 25g'], [4, 'apple 25g'], [5, 'banana 25g'], [5, 'orange 25g'], [1, 'banana 25g'], ]); $command->execute();
同時 yii\db\Command還能夠經過 query命令生成一個yii\db\DataReader實例,而後調用 read(),readAll() ,readColumn()來進行數據讀取
$dataReader = $command->query(); //$result = $dataReader->read(); //$result = $dataReader->readAll(); //這裏的 readColumn 能夠設置讀第幾列喲 $result = $dataReader->readColumn(2);
學會這兩個工具類就足夠咱們應對偏原生的sql了,那個QueryBulider就不說了,偏內部調用,不是面向開發者的工具類