国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Yii的學習(3)--查詢生成器 (Query Builder)

2019-11-15 01:40:40
字體:
來源:轉載
供稿:網友
Yii的學習(3)--查詢生成器 (Query Builder)

原文地址:http://www.yiiframework.com/doc/guide/1.1/en/database.query-builder

不過原文是英文的,Yii的官網沒有翻譯這一章,自己就嘗試著翻譯了一下,有很多地方時會按自己的理解寫,不一定完全按原文翻譯。。。

Yii的查詢生成器提供了用面向對象的方式寫SQL語句。它允許開發人員使用類的方法和屬性來指定一個SQL語句的各個部分。然后,組裝成一個有效的SQL語句,可以通過調用DAO數據訪問對象的描述方法為進一步執行。以下顯示了一個典型的使用查詢生成器建立一個select語句:

$user = Yii::app()->db->createCommand()    ->select('id, username, 

當你在應用程序中需要組裝SQL語句的程序,或基于一些條件邏輯時,最好使用查詢生成器。使用查詢生成器的好處主要包括:

它不強制使用查詢生成器。事實上,如果你的查詢是簡單的,它是更容易和更快的直接寫SQL語句。

注:查詢生成器不能用于修改現有的查詢指定為SQL語句。例如,下面的代碼將不能工作:

$command = Yii::app()->db->createCommand('SELECT * FROM tbl_user');// the following line will NOT append WHERE clause to the above SQL$command->where('id=:id', array(':id'=>$id));

換句話說,不要混合使用普通的SQL和查詢生成器。

1. 制備查詢生成器(Preparing Query Builder)

Yii的查詢生成器是從 CDbCommand提供主要數據庫查詢類,描述數據訪問對象。

開始使用查詢生成器,我們創造了CDbCommand的一個新實例,

$command = Yii::app()->db->createCommand();

我們使用Yii::app()->db來獲得數據庫連接,然后調用CDbConnection::createCommand()創建所需的命令實例。

請注意,將整個SQL語句放入 createcommand() ,叫做數據訪問對象,我們需呀把設置它為空。這是因為我們將在下面的解釋中使用查詢生成器添加SQL語句的各個部分的方法。

2. 建立數據檢索查詢(Building Data Retrieval Queries)

數據檢索查詢是指選擇SQL語句。查詢生成器提供了一套方法來建立一個SELECT語句的各個部分。因為所有這些方法返回CDbCommand的實例,我們可以使用方法鏈調用他們,如圖所示,在本節開頭的例子。

  • select(): 指定查詢的選擇部分 specifies the SELECT part of the query
  • selectDistinct(): 指定查詢不重復的選擇部分 specifies the SELECT part of the query and turns on the DISTINCT flag
  • from(): 指定查詢的FROM specifies the FROM part of the query
  • where(): 指定查詢的WHERE specifies the WHERE part of the query
  • andWhere(): 用and的方式添加到WHERE的條件中 appends condition to the WHERE part of the query withANDOperator
  • orWhere(): 用or的方式添加到WHERE的條件中 appends condition to the WHERE part of the query withORoperator
  • join(): 添加一個內部聯接的查詢片段 appends an inner join query fragment
  • leftJoin(): 追加一個左外連接查詢片段 appends a left outer join query fragment
  • rightJoin(): 追加一個右外部聯接查詢片段 appends a right outer join query fragment
  • crossJoin(): 追加一個交叉連接查詢片段 appends a cross join query fragment
  • naturalJoin(): 追加一個自然連接查詢片段 appends a natural join query fragment
  • group(): 指定查詢的GROUP BY specifies the GROUP BY part of the query
  • having(): 指定查詢的HAVING specifies the HAVING part of the query
  • order(): 指定查詢的ORDER BY specifies the ORDER BY part of the query
  • limit(): 指定查詢的LIMIT specifies the LIMIT part of the query
  • offset(): 指定查詢的OFFSET specifies the OFFSET part of the query
  • union(): 添加查詢的UNION appends a UNION query fragment

在下面,我們將解釋如何使用這些查詢生成器方法。為簡單起見,我們假設底層數據庫是MySQL。注意:如果你使用的是其他數據庫,表/列/值引用的例子可能是不同的。

select()
function select($columns='*')

該select()方法指定一個查詢的選擇部分。$columns參數指定要選擇的列,它可以是一個字符串,用逗號分隔列,或者一個數組的列名稱。列的名稱可以包含表的前綴和 / 或列別名。該方法將自動引用列名,除非一列包含一些括號(這意味著這個列是一個DB的表達式)。

下面是一些例子:

// SELECT *select()// SELECT `id`, `username`select('id, username')// SELECT `tbl_user`.`id`, `username` AS `name`select('tbl_user.id, username as name')// SELECT `id`, `username`select(array('id', 'username'))// SELECT `id`, count(*) as numselect(array('id', 'count(*) as num'))
selectDistinct()
function selectDistinct($columns)

selectdistinct()方法類似于select(),除了它打開了DISTINCT的標志。例如,selectdistinct('id,用戶名”)會產生以下SQL:

SELECT DISTINCT `id`, `username`
from()
function from($tables)

from()方法指定來了一個查詢的FROM部分。$tables參數指定表的選擇。這可以是一個字符串,用逗號分隔的表的名稱,或表名數組。表的名稱可以包含架構前綴(例如公共。tbl_user)和/或表的別名(e.g.tbl_user U)。該方法將自動引用表的名稱,除非它包含一些括號(即表是一個給定的子查詢或DB的表達式)。

下面是一些例子:

// FROM `tbl_user`from('tbl_user')// FROM `tbl_user` `u`, `public`.`tbl_profile` `p`from('tbl_user u, public.tbl_profile p')// FROM `tbl_user`, `tbl_profile`from(array('tbl_user', 'tbl_profile'))// FROM `tbl_user`, (select * from tbl_profile) pfrom(array('tbl_user', '(select * from tbl_profile) p'))
where()
function where($conditions, $params=array())

where()方法指定查詢的WHERE。$conditions 參數指定查詢條件的同時,$params 指定參數綁定到整個查詢。$conditions參數可以是一個字符串(例如id =1)或一個數組中的格式:

array(operator, operand1, operand2, ...)

operator可以是以下的任何一個:

  • and: operands應該使用 and連接在一起。例如,array('and', 'id=1', 'id=2')將產生id=1 AND id=2。如果一個操作數是一個數組,它將使用這里描述的相同規則轉換成一個字符串。例如,array('and', 'type=1', array('or', 'id=1', 'id=2'))將生成type=1 AND (id=1 OR id=2)。

  • or: 類似 and 操作,除了operands是使用 OR 連接的。

  • in: operand 1應是一個列或DB表達式,而 operand 2是代表值的范圍的數組,列或 DB 表達式應在這個數組的范圍內。例如,array('in', 'id', array(1,2,3))將生成id IN (1,2,3)

  • not in: 類似 in 操作,除了用 NOT IN 代替 IN 去生成SQL。

  • like: operand 1應是一個列或DB 表達式,而operand 2是代表值的范圍的數組,列或 DB 表達式應在這個數組的范圍內。例如,array('like', 'name', '%tester%')會生成name LIKE '%tester%'。當規定值的范圍為一個數組時,多個 LIKE 生成SQL時會用 AND 連接。例如,array('like', 'name', array('%test%', '%sample%'))會生成name LIKE '%test%' AND name LIKE '%sample%'。

  • not like:類似 like 的操作,除了用 NOT LIKE代替 LIKE 去生成SQL。

  • or like: 類似 like 的操作,除了多個 like 生成 SQL 時用OR連接。

  • or not like: 類似 not like 的操作,除了多個 like 生成 SQL 時用OR連接。

下面是一些例子,使用的地方:

// WHERE id=1 or id=2where('id=1 or id=2')// WHERE id=:id1 or id=:id2where('id=:id1 or id=:id2', array(':id1'=>1, ':id2'=>2))// WHERE id=1 OR id=2where(array('or', 'id=1', 'id=2'))// WHERE id=1 AND (type=2 OR type=3)where(array('and', 'id=1', array('or', 'type=2', 'type=3')))// WHERE `id` IN (1, 2)where(array('in', 'id', array(1, 2))// WHERE `id` NOT IN (1, 2)where(array('not in', 'id', array(1,2)))// WHERE `name` LIKE '%Qiang%'where(array('like', 'name', '%Qiang%'))// WHERE `name` LIKE '%Qiang' AND `name` LIKE '%Xue'where(array('like', 'name', array('%Qiang', '%Xue')))// WHERE `name` LIKE '%Qiang' OR `name` LIKE '%Xue'where(array('or like', 'name', array('%Qiang', '%Xue')))// WHERE `name` NOT LIKE '%Qiang%'where(array('not like', 'name', '%Qiang%'))// WHERE `name` NOT LIKE '%Qiang%' OR `name` NOT LIKE '%Xue%'where(array('or not like', 'name', array('%Qiang%', '%Xue%')))

請注意,當操作者含有like時,我們必須明確指定的通配符(如%和_)的模式。如果參數是從用戶的輸入,我們也應該使用下面的代碼轉義特殊字符,以防止他們被當作通配符:

$keyWord=$_GET['q'];// escape % and _ characters$keyword=strtr($keyword, array('%'=>'/%', '_'=>'/_'));$command->where(array('like', 'title', '%'.$keyword.'%'));
andWhere()
function andWhere($conditions, $params=array())

用 and 的方式添加到WHERE的條件中。此方法的行為幾乎是 where() 相同,除了它只是添加條件不能取代它。在where()文檔中有該方法參數的詳細信息。

orWhere()
function orWhere($conditions, $params=array())

用 or 的方式添加到WHERE的條件中。此方法的行為幾乎是 where() 相同,除了它只是添加條件不能取代它。在where()文檔中有該方法參數的詳細信息。

order()
function order($columns)

order() 方法指定查詢的ORDER BY部分。$columns參數指定列進行排序,這可以是一個包含用逗號分隔列和order的方向(ASC 或DESC)的字符串,或者一個列和order的方向的數組。列名稱可以包含表前綴。該方法將自動引用列名,除非一列包含一些括號(即給出一個DB表達式)。

下面是一些例子:

// ORDER BY `name`, `id` DE
上一篇:Java

下一篇:ajax 跨域解決方法

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乌兰浩特市| 晋州市| 买车| 清丰县| 高安市| 太仓市| 广河县| 彭阳县| 镇原县| 新泰市| 房产| 页游| 诏安县| 忻城县| 霍林郭勒市| 盐源县| 荣昌县| 新平| 关岭| 江西省| 庐江县| 大荔县| 徐汇区| 浑源县| 镇安县| 盐亭县| 青浦区| 黔江区| 元氏县| 乡城县| 宝应县| 乐清市| 清镇市| 星子县| 宁化县| 富裕县| 阳原县| 台北市| 阿坝| 新余市| 大兴区|