Miles' Blog

天涯何處無幹話,何必要講實務話

Zend_Db_Select

使用物件提供的方法建構出 SQL 並查詢

Zend_Db_SelectZend_Db_Table_Select 大同小異,只差在一個沒有指定 Table,一個有指定 Table。

所以,基本上 Zend_Db_Table_Select 是不需要使用 from() 的,以下用 Zend_Db_Select 做說明

Initialization

Zend_Db_Select 取得方法

// Database adapter
$db;

$select = $db->select();

Zend_Db_Table_Select 取得方法

// DbTable
$table;

$select = $table->select();

DEBUG 方法

// 顯示產生出來的SQL
echo $select->__toString();

Reset

// 清除特定的部分
$select->reset(Zend_Db_Select::ORDER);
// 全部清除
$select->reset();

Basic

FROM statement

from(array|string|\Zend_Db_Expr $name, array|string|\Zend_Db_Expr $cols = '*', string $schema = null)  

參數

  • $name 資料表名稱,array 是要取別名用的: array(‘別名’ => ‘資料表名’)
  • $col 該資料表裡的欄位名稱,欄位名稱也可以是 expression,一樣可以使用 Zend_Db_Expr,array 範例: array(‘別名’ => ‘欄位名’, ‘欄位名’)
  • $schema Schema名稱
$select->from(
array('t' => 'table'),
array('sum' => new Zend_Db_Expr('SUM(num)')),
'database'
);
// SELECT SUM(num) AS `sum`
// FROM `database`.`table` AS `t`

COLUMN statement

columns(array| string|\Zend_Db_Expr $cols = '*', string $correlationName = null)

參數

  • $cols 欄位名,或array: array(‘別名’ => ‘欄位名或 expression’)
  • $correlationName 別名
$select->from('table', `)
->columns(array('n' => 'number'))
;
// SELECT `table`.*, `table`.`number` AS `n`
// FROM `table`

JOIN statement

join(array|string|\Zend_Db_Expr $name, string $cond, array|string $cols = self::SQL_WILDCARD, string $schema = null)

參數

  • $name 資料表名稱,用法同 from()
  • $cond join的條件式
  • $cols 欄位名,用法同 from()

join 預設是 joinInner,其他 join 的格式都一樣:

  • joinLeft
  • joinRight
  • joinFull

joinCross 與 joinNatural 不需要 $cond

$select->from(array('t' => 'table'))
->join(array('o' => 'out'),
't.id = o.fk_id',
array())
;
// SELECT `t`.*
// FROM `table` AS `t`
// INNER JOIN `out` AS `o` ON t.id = o.fk_id

WHERE Statement

範例

$select->from('products')
->where('price > 100.00')
;
// SELECT `products`.*
// FROM `products`
// WHERE (price > 100.00)

$select->from('products')
->where('price > ?', $price)
;
// SELECT `products`.*
// FROM `products`
// WHERE (price > 100.00)

$select->from('products')
->where('price IN(?)', array(1, 2, 3))
;
// SELECT `products`.*
// FROM `products`
// WHERE (price IN(1, 2, 3))

$select->from('products')
->where('price > ?', 100)
->where('price < ?', 200)
;
// SELECT `products`.*
// FROM `products`
// WHERE (price > 100) AND (price < 200)

$select->from('products')
->where('price < ?', 100)
->orWhere('price > ?', 200)
;
// SELECT `products`.*
// FROM `products`
// WHERE (price < 100) OR (price > 200)

GROUP BY

範例

$select->group(array('a', 'b'));

// GROUP BY `a`, `b`

HAVING

$select->having('sum > ?', 10);
// HAVING (sum > 10)

ORDER BY

範例

$select->order(array(
'col1', // `col1` ASC
'col2 ASC', // `col2` ASC
'col3 DESC' // `col3` DESC
))
;

// ORDER BY `col1` ASC, `col2` ASC, `col3` DESC

LIMIT

範例

$select->limit(20);
// LIMIT 20

$select->limit(20, 10);
// LIMIT 20 OFFSET 10

$select->limitPage(2, 10);
// LIMIT 20 OFFSET 10
// 第一個參數指的是頁數,第二個參數指的是一頁幾筆

DISTINCT

$select->distinct();

UNION

Executing Select Queries

Zend_Db_Select

$db->query() 會回傳 Statement 物件

$stmt = $db->query($select);
$result = $stmt->fetchAll();

Zend_Db_Table_Select

$select = $table->select();

// 取得多筆
$rows = $table->fetchAll($select);
// 或取得單筆
$row = $table->fetchRow($select);

Executing Custom Queries

Zend_Db_Select

範例

$sql = "SELECT * FROM `table`";

$db->fetchAll($sql);
$db->fetchAssoc($sql);
$db->fetchRow($sql);
$db->fetchCol($sql);
$db->fetchOne($sql);
$db->fetchPairs($sql);

Zend_Db_Table_Select

範例

$sql = "SELECT * FROM `table`";

$db->fetchAll($sql);
$db->fetchRow($sql);
0%