Yii2 查詢構建器(Query Builder)

進行數據庫配置

使用原生 sql

下一步我們創建 yii\db\Command 對象就可以執行sql語句了

$result = Yii::$app->db->createCommand($sql)->查詢方法

常見的’查詢方法’都有這些

queryAll、queryOne、queryScalar

示例

如果我們想獲取 user 表內所有的數據

$sql = "SELECT * FROM `article`";
$result = Yii::$app->db->createCommand($sql)->queryAll();

同理,queryOne()是獲取一條數據,queryScalar是獲取一個值

注意事項

1、queryOne方法只返回結果集中的一條數據,實際查詢的條件語句中並不會帶上limit 1,如果你調用該方法查詢數據,但是不能保證返回的結果集只有一條,爲了性能考慮,請務必添加limit 1這個條件

2、在一些接收用戶提交的參數的where條件上,千萬不要像下面這樣直接拼接where條件

$id = $_GET['id'];
$sql = "SELECT * FROM `article` WHERE id = '{$id}'";
$result = Yii::$app->db->createCommand($sql)->queryAll();

實際開發中,爲了避免sql注入,請一定不要參考上面的寫法!綁定參數是一種避免sql注入的友好方式

來看下正確的寫法

$result = Yii::$app->db->createCommand('SELECT * FROM `article` WHERE id=:id')
	->bindValue(':id', $_GET['id'])
	->queryOne();

如果where條件的參數不是來自於用戶端,那隨便寫。

查詢構建器(Query Builder)

相對於原生sql,query builder就安全的多了,而且,一旦你的sql很長,query builder構建的sql語句,可讀性也會更強

使用方法

實例化\yii\db\Query類,然後調用查詢方法即可。

$query = new \yii\db\Query;
$results = $query
    ->select(['id', 'email'])
    ->from('user')
    ->where(['username' => 'aa'])
    ->limit(5)
    ->all();

查看具體sql的方法

有兩種方式:

1、藉助yii-debug的使用,在DB一欄可觀察到具體執行的sql語句

2、在上面的基礎上,執行下面的sql語句,打印具體的sql語句

$sql = $query->createCommand()->getRawSql();
var_dump($sql);

使用查詢構造器不用綁定參數
常見的查詢方法, all、one、scalar、count、sum、min、average等等

one方法沒有limit 1,在不保證結果集是一條的基礎上,請一定要在query上追加limit(1)

示例

假設我們要構建的sql如下

1、SELECT `id`, `email` FROM `user` WHERE `id` IN (1,2,3,4,5,6,7,8)
2、SELECT `id`, `email` FROM `user` WHERE `id` = 1 OR `id` = 2
3、SELECT `id`, `email` FROM `user` WHERE `username` LIKE '%aa%'
4、SELECT `id`, `email` FROM `user` WHERE (`username` LIKE '%aa%') OR (`title` LIKE '%aa%')
5、SELECT `id`, `email` FROM `user` WHERE 1 = 1 AND (`name` = '李四' OR `age` =  21) // 注意小括號的位置,在有些情況下錯不得

query構建結果分別如下

$query = new \yii\db\Query;

1$results = $query
    ->select(['id', 'email'])
    ->from('user')
    ->where(['IN', 'id', [1,2,3,4,5,6,7,8]])
    ->all();
2$results = $query
    ->select(['id', 'email'])
    ->from('user')
    ->where(['OR', 'id=1', 'id=2'])
    ->all();
3$results = $query
    ->select(['id', 'email'])
    ->from('user')
    ->where(['LIKE', 'username', 'aa'])
    ->all();
4$results = $query
    ->select(['id', 'email'])
    ->from('user')
    ->where(['LIKE', 'username', 'aa'])
    ->orWhere(['LIKE', 'title', 'aa'])
    ->all();
或者:
$results = $query
    ->select(['id', 'email'])
    ->from('user')
    ->where(['OR', ['LIKE', 'username', 'aa'], ['LIKE', 'title', 'aa']])
    ->all();
5$results = $query
    ->select(['id', 'email'])
    ->from('user')
    ->where([1 => 1])
    ->andWhere(['OR', 'name=李四', 'age=21'])
    ->all();
下面我們再來看一下連表的操作

SELECT `t`.`id`, `t`.`email`, `t2`.`type` 
FROM `user` AS `t` 
LEFT JOIN `auth` AS `t2` 
ON `t`.`id` = `t2`.`id`
WHERE `t`.`id` = 1
query的實現方式

$query = new \yii\db\Query;
$results = $query
    ->select(['t.id', 't.email', 't2.type'])
    ->from(['t' => 'user'])
    ->leftJoin(['t2' => 'auth', 't.id' => 't2.id'])
    ->where(['t.id' => 1])
    ->all();

除此之外,還有很多諸如orderBy、groupBy、having、union等方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章