yii2使用原生語句執行數據庫操做yii\db\Query和yii\db\Command

某些狀況下咱們並不須要啓用比較重的AR去操做數據庫,這裏Yii2也爲咱們提供了sql

yii\db\Query            查詢構造器 只能建立 查詢 命令數據庫

yii\db\Command     sql命令工具 能夠建立 curd 操做app

兩個工具類來知足此類需求,還有個 yii\db\QueryBuilder 感受用起來有些彆扭,感興趣的本身去看吧yii

yii\db\Query

查詢構造器能夠比較靈活的構建出各類查詢命令(不過我以爲靈活是對不太熟悉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

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就不說了,偏內部調用,不是面向開發者的工具類

相關文章
相關標籤/搜索