我想使用Zend_db_select和JOIN构建一个查询。数据库如下:
[作者表] pk:'id' attr:'name'
[预订表] pk:'id' attr:'name' fk:'author.id'
我有author.name作为参数。 我想要检索所有相关书籍(只有book.name,而不是其他列)
请帮忙。 感谢
答案 0 :(得分:4)
如果你真的需要使用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查询添加列,表或表达式。在这些场景中,有一个像Zend_Db_Select这样的类可以帮助您向SQL查询添加子句。
但是如果你有一个不需要任何动态子句的查询,那么它更简单,更易读,更容易调试,并且更易于维护以在一个字符串文字中表达SQL查询,如在我上面的第二个例子中。
对于安全性,您可以使用参数占位符作为作者名称,并在准备查询后将该值作为参数提供。使用Zend_Db_Select时,您可以使用文字SQL查询轻松完成此操作。