我想使用Zend_db_select和JOIN構建查詢。數據庫如下:SELECT with JOIN
[AUTHOR表] PK: 'ID' ATTR: '名稱'
[簿表] PK: 'ID' ATTR: '名稱' FK:' author.id'
我有author.name作爲參數。 我想檢索所有相關書籍(只有book.name,而不是其他欄)
請幫忙。 感謝
我想使用Zend_db_select和JOIN構建查詢。數據庫如下:SELECT with JOIN
[AUTHOR表] PK: 'ID' ATTR: '名稱'
[簿表] PK: 'ID' ATTR: '名稱' FK:' author.id'
我有author.name作爲參數。 我想檢索所有相關書籍(只有book.name,而不是其他欄)
請幫忙。 感謝
如果你確實需要使用Zend_Db_Select對象,你可以這樣做:
$select = $db->select()
->from(array("a"=>"AUTHOR"), array("author_name"=>"name"))
->join(array("b"=>"BOOK"), "a.id = b.`author.id`", array("book_name"=>"name"))
->where("a.name = ?", $authorName);
$stmt = $select->query();
然而,這種帶有常用的警告:有沒有規定使用Zend_Db_Select對象爲每個查詢。當您的查詢必須基於應用程序條件動態構建時,最好使用Zend_Db_Select。在這種情況下,沒有理由使用Zend_Db_Select。
所以我會做這更清楚的只是用文字SQL:
$sql = "
SELECT a.name AS author_name, b.name AS book_name
FROM AUTHOR AS a JOIN BOOK AS b ON a.id = b.`author.id`
WHERE a.name = ?";
$books = $db->fetchAll($sql, $authorName);
回覆您的評論:Zend_Db_Select對象不在安全或性能方面,你不能得到的只是提供什麼如同其他方式一樣容易。無論您是使用Zend_Db_Select還是隻爲您的SQL使用單個文字字符串,最終結果都是一樣的:您隨後會將其準備爲SQL查詢。數據庫不知道您創建該字符串的不同方式。
根據應用程序邏輯,應用程序通常會根據條件爲SQL查詢添加列,表或表達式。在這些場景中,有一個像Zend_Db_Select這樣的類可以方便地添加子句到SQL查詢。
但如果你有一個查詢,不需要任何動態的條款,它更簡單,更具可讀性,更容易調試和維護更方便表達SQL查詢在一個字符串字面量,如在我的第二個例子以上。
至於安全性,您可以使用作者名稱的參數佔位符,並在準備查詢後將該值作爲參數提供。您可以像使用Zend_Db_Select一樣輕鬆地使用文字SQL查詢來完成此操作。
非常感謝,有效。我知道我已經超出了原始問題的範圍,但是您不能簡單地闡述爲什麼在這裏不需要使用Zend_Db_Select?一般來說,這樣做沒有任何優勢(性能或安全性)? – Max 2010-06-21 21:01:03
這聽起來像是一個自信的答案。我要買它。再次感謝。如果我可以說,「很高興結束」。 – Max 2010-06-22 08:13:07