2010-06-21 5 views
1

Je souhaite créer une requête en utilisant Zend_db_select et JOIN. La base de données est la suivante:SELECT avec JOIN

[table AUTHOR] pk: 'id' attr: 'nom'

[table BOOK] pk: 'id' attr: 'nom' fk: ' author.id '

J'ai un author.name en paramètre. Je veux récupérer tous les livres connexes (seulement book.name, pas les autres colonnes)

S'il vous plaît aider. Merci

Répondre

4

Si vous avez vraiment besoin d'utiliser Zend_Db_Select, vous pouvez le faire:

$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(); 

Cependant, cela vient avec la mise en garde habituelle: il n'y a pas besoin d'utiliser Zend_Db_Select pour chaque requête. Zend_Db_Select est mieux utilisé lorsque votre requête doit être construite dynamiquement en fonction des conditions de l'application. Dans ce cas, il n'y a aucune raison d'utiliser Zend_Db_Select.

donc je referais ce plus simplement en utilisant simplement SQL littérale:

$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); 

Re votre commentaire: Zend_Db_Select ne fournit rien en termes de sécurité ou les performances que vous ne pouvez pas obtenir seulement aussi facilement d'autres façons. Que vous utilisiez Zend_Db_Select ou juste une seule chaîne littérale pour votre SQL, le résultat final est la même chose: une chaîne que vous préparez par la suite en tant que requête SQL. La base de données n'a aucune idée des différentes façons dont vous avez créé cette chaîne.

Il est courant que les applications ajoutent des colonnes, des tables ou des expressions à une requête SQL, selon la logique de l'application. Dans ces scénarios, il est pratique d'avoir une classe comme Zend_Db_Select qui vous aide à ajouter des clauses à la requête SQL.

Mais si vous avez une requête qui n'a pas besoin des clauses dynamiques, il est plus simple, plus lisible, plus facile à déboguer, et plus facile à maintenir pour exprimer la requête SQL dans une chaîne littérale, comme dans mon deuxième exemple au dessus. En ce qui concerne la sécurité, vous pouvez utiliser un espace réservé de paramètre pour le nom de l'auteur et fournir cette valeur en tant qu'argument après la préparation de la requête. Vous pouvez le faire aussi facilement avec une requête SQL littérale que possible avec Zend_Db_Select.

+0

Merci beaucoup, ça marche. Je sais que je vais sortir du cadre de la question initiale, mais ne pourriez-vous pas expliquer brièvement pourquoi l'utilisation de Zend_Db_Select n'est pas nécessaire ici? N'y a-t-il pas des avantages (performance ou sécurité) à le faire en général? – Max

+0

Cela ressemble à une réponse confiante. Je vais le prendre. Encore une fois merci. "bon à fermer" si je peux dire. – Max