Yii2查詢之where條件拼裝

2021-08-15 04:11:59 字數 4345 閱讀 3556

2017-01-22

4282瀏覽記錄

目錄 熟悉yii2的查詢條件後,用active record查詢資料非常方便。

以下我們介紹where()方法當中,條件的拼裝方式。

yii2用where()方法(當然還有其他方法)來實現條件篩選,語法:

public $this

where ( $condition, $params =  )

$params為可選引數,指定要繫結查詢的值。

$condition為必選引數,$condition可以是字串(如'id=1')或者陣列。

$condition為陣列時,有兩種格式:

通常,雜湊格式的查詢條件生成這樣的sql語句:

column1=value1 and column2=value2 and ...
如果某個值是陣列,就會生成in語句。

如果某個值為null,會用is null來生成語句。

例子:

['type' => 1, 'status' => 2]            // 生成:(type = 1) and (status = 2)

['id' => [1, 2, 3], 'status' => 2]  // 生成:(id in (1, 2, 3)) and (status = 2)

['status' => null] // 生成:status is null

在運算子格式,yii會根據指定的運算子生成sql語句。

運算子有:andornotbetweennot betweeninnot

inlikeor likenot likeor

not likeexistsnot

exists><=>=<=!=等。

['>', 'id', 1]                                        // 生成:id > 1

['<', 'id', 100] // 生成:id < 100

['=', 'id', 10] // 生成:id = 10

['>=', 'id', 1] // 生成:id >= 1

['<=', 'id', 100] // 生成:id <= 100

['!=', 'id', 10] // 生成:id != 10

具體生成的sql語句,運算子id會自動加上反斜槓引號`,運算數會自動轉義。

['and', 'id' => 1, 'id' => 2]                        // 生成:id=1 and id=2

['and', 'id=1', 'id=2']                           // 生成:id=1 and id=2

['and', 'type=1', ['or', 'id=1', 'id=2']] // 生成:type=1 and (id=1 or id=2)

在第2條和第3條語句中,列名稱和搜尋值未用鍵值關係指定,所以生成的sql不會新增引號,也不會轉義。

['or', ['type' => [7, 8, 9]], ['id' => [1, 2, 3]]]   // 生成:(type in (7, 8, 9) or (id in (1, 2, 3)))
['not', ['attribute' => null]]                       // 生成:not (attribute is null)
['between', 'id', 1, 10]                             // 生成:id between 1 and 10

['not between', 'id', 1, 10] // 生成:id not between 1 and 10

運算子後面的運算數1為資料表列名稱,運算數2和運算數3分別為列值範圍的最小值和最大值。

['in', 'id', [1, 2, 3]]                               // 生成:id in (1, 2, 3)

['not in', 'id', [1, 2, 3]]  // 生成:id not in (1, 2, 3)

運算子後面的運算數1為列名稱或db表示式,運算數2為陣列,指定列值所在的範圍。

這個方法會為值新增引號,並正確轉義。

要生成混合in條件,列名和列值都設定為陣列,並且用列名為列值指定下標:

['in', ['id', 'name'], [['id' => 1, 'name' => 'foo'], ['id' => 2, 'name' => 'bar']]]  // 生成:(`id`, `name`) in ((1, 'foo'), (2, 'bar'))
另外,還可以用子查詢作為in條件的值,如下:

['in', 'user_id', (new query())->select('id')->from('users')->where(['active' => 1])]
['like', 'name', 'tester']                             // 生成:name like '%tester%'

['like', 'name', ['test', 'sample']] // 生成:name like '%test%' and name like '%sample%'

['like', 'name', '%tester', false] // 生成:name like '%tester'

// 這是自定義查詢方式,要傳入值為false的運算數3,並且自行新增%

運算數

後面的運算數1為列名稱或db表示式,運算數2為字串或陣列,指定列值查詢條件。

這個方法會為值新增引號,並正確轉義。

or likenot likeor

not like用法和like一樣。

['or like', 'name', ['test', 'sample']]                 // 生成:name like '%test%' or name like '%sample%'

['not like', 'name', 'tester'] // 生成:name not like '%tester%'

['or not like', 'name', ['test', 'sample']] // 生成:name not like '%test%' or name not like '%sample%'

['exists', (new query())->select('id')->from('users')->where(['active' => 1])] // 生成:exists (select "id" from "users" where "active"=1)
not

exists用法和exists一樣。

標籤:yii, 查詢

Yii2查詢之where條件拼裝

目錄 1語法2雜湊格式 3運算子格式 3.1對比 3.2and 3.3or 3.4not 3.5between和not between 3.6in和not in 3.7like 3.8exists 熟悉yii2的查詢條件後,用active record查詢資料非常方便。以下我們介紹where 方法當...

Yii2 查詢條件

字串格式,例如 status 1 雜湊格式,例如 status 1,type 2 操作符格式,例如 like name test andfilterwhere between updated at oldtime,current andwhere between updated at oldtime...

Yii2 where 條件 整理

yii2 where 涉及的幾種形式 where addparams filterwhere andwhere orwhere andfilterwhere orfilterwhere andfiltercompare 字串格式,例如 status 1 雜湊格式,例如 status 1,type 2...