CDBCriteria是Yii中非常重要的部分,它提供了一種方便快捷的方式,用于構建包含過濾、排序和限制的SQL語句。CDBCriteria通過一些易于使用的方法,使得生成靜態SQL語句變得非常容易。
就像一個簡單的例子,假設我們需要獲取用戶表中所有用戶名以字母a開頭的用戶。我們可以使用CDBCriteria來構建這個查詢:
```
$criteria = new CDbCriteria;
$criteria->condition = 'username LIKE :prefix';
$criteria->params = array(':prefix'=>'a%');
```
我們首先通過創建一個新的CDbCriteria實例開始,然后使用condition屬性設置WHERE子句。在這個例子中,我們使用LIKE操作符來查找用戶名以a開頭的用戶,同時通過params屬性設置了一個參數。這樣做允許我們使用命名占位符來防止SQL注入攻擊。
接下來,在Yii的find()方法中使用這個criteria對象就可以了:
```
$users = User::model()->findAll($criteria);
```
這里User是一個繼承自 CActiveRecord 的模型類。
CDBCriteria不僅可以用于查詢,也可以用于更新和刪除操作。下面我們來看一個更復雜的例子:
假設我們有一個訂單表,結構如下:
```
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_name VARCHAR(255),
total_price DECIMAL(10, 2),
status TINYINT
);
```
我們需要完成兩個任務:
1.查詢那些訂單總價超過100元,但是沒有被處理的訂單,按照創建時間倒序排列;
2.更新那些已經處理的訂單的狀態。
首先,我們使用CDBCriteria創建一個查詢對象。
```
$criteria = new CDbCriteria;
$criteria->select = 'id, customer_name, total_price';
$criteria->condition = 'total_price >:price AND status = :status';
$criteria->params = array(':price'=>100, ':status'=>0);
$criteria->order = 'create_time DESC';
```
在這個例子中,我們使用select屬性來設置查詢結果所需的字段。condition和params屬性用于設置WHERE子句,order屬性用于設置ORDER BY子句。
接下來,我們使用ActiveRecord的updateAll()方法來更新訂單狀態:
```
$updateCriteria = new CDbCriteria;
$updateCriteria->condition = 'status = :status';
$updateCriteria->params = array(':status'=>0);
$updateCriteria->limit = 10;
Order::model()->updateAll(array('status' =>1), $updateCriteria);
```
在這個例子中,我們使用CDbCriteria的limit屬性限制了操作的記錄數。updateAll()方法的第一個參數是要更新的字段,第二個參數是查詢條件。
總的來說,CDBCriteria是Yii非常實用的一個部分,廣泛用于數據查詢、更新和刪除。它提供了一種易于使用的方式,幫助我們構建復雜的SQL語句,同時避免了SQL注入攻擊。如果你還沒有使用過CDBCriteria,那么現在就開始使用吧!
上一篇php bbs推送