2009-08-13 17 views
2

J'ai un problème avec une requête qui fonctionne dans phpmyadmin mais pas avec Zend_db. Vous pouvez lire au sujet de la requête dans SQL statement with several joinsRequête Zend_Db Mysqli prepare error: L'opérande doit contenir 1 colonne (s)

Je ces tables

Post 
    ID 
    entry 
Category 
    ID 
    name 
CategoryBinding 
    ID 
    postID 
    categoryID 

Et voici mon code php:

class Blog_Model_DbTable_Posts extends Zend_Db_Table 
    { 
     protected $_name = 'Posts'; 
    public function getByCategoryId($id) 
    { 
      $query = 
    "SELECT * 
FROM `Post` AS `p` 
LEFT JOIN `CategoryBinding` AS `cb` ON p.ID = cb.postID 
LEFT JOIN `Category` AS `c` ON cb.categoryID = c.ID 
INNER JOIN `Post` AS `p2` ON p.id = p2.id 
WHERE p.id in 
(
    SELECT p2.id 
     FROM `Post` as `p2` 
     LEFT JOIN `CategoryBinding` AS `cb` ON p2.ID = cb.postID 
     LEFT JOIN `Category` AS `c` ON cb.categoryID = c.ID 
     WHERE c.id = 1 
    ) 
    " 
return parent::fetchAll($query); 

J'ai essayé d'exécuter cette requête avec Boath l'adopteur AOP et avec l'adopteur de mysqli. Je reçois cette erreur avec l'adopteur mysqli.

Mysqli prepare error: Operand should contain 1 column(s) 

J'ai googlé à ce sujet et constaté qu'il est peut-être un bogue dans Zend_Db, mais depuis ma connaissance sql est un peu limité, je ne sais pas si je fais quelque chose de mal ou si elle est en effet un bug. Pouvez-vous s'il vous plaît m'aider à comprendre cela? Réservoir Vous.

+0

Quelle version de Zend utilisez-vous? Une recherche rapide montre qu'un bug qui pourrait être lié existe dans 1.5 - 1.8 http://framework.zend.com/issues/browse/ZF-3311 – Brandon

+0

J'utilise 1.9 (la version la plus récente) – unkownt

Répondre

4

Au lieu de

parent::fetchAll($query); 

Utilisez

$this->getAdapter()->fetchAll($query); 
+1

Correct. La méthode Table 'fetchAll()' est différente de la méthode Adapter 'fetchAll()'. Ce dernier prend une instruction SQL complète. Le premier prend soit une expression SQL à utiliser dans une clause WHERE, soit un objet de type Zend_Db_Table_Select. –

+0

Merci, je ne pense pas que j'aurais pu résoudre ça sans votre aide. – unkownt