2009-02-06 7 views
7

Je vais avoir quelques problèmes traduire cette requête à utiliser Zend_Db_Select ZF:Traduire une requête à utiliser Zend_Db_Select

SELECT b.id, b.title, b.description 
FROM memberships AS m 
JOIN blogs AS b ON b.id = m.blog_id 
WHERE m.user_id = ? 
ORDER BY m.created 
LIMIT 0, 30 

(cette requête fonctionne et renvoie les résultats)

Memberships est une table de lien entre blogs et users. C'est une simple affaire | id | blog_id | user_id |.

Voici ce que j'ai jusqu'à présent:

// $table = Zend_Db_Table instance, $id = a user id 
$select = $table->select() 
->from(array('m' => 'memberships'), array('b.id', 'b.title', 'b.description')) 
->join(array('b' => 'blogs'), 'b.id = m.blog_id') 
->where('m.user_id = ?', (int) $id) 
->order('m.created DESC') 
->limit(0, 30); 

C'est le (étrange (me)) erreur que je reçois:

#0: Select query cannot join with another table

Apparu sur la ligne 211 .

Merci pour votre aide.

Répondre

9

Lorsque récupéré de votre objet de table, l'instruction sera limitée à cette table, je pense. La méthode Zend_Db_Table::select() renvoie un objet Zend_Db_Table_Select qui est une sous-classe de Zend_Db_Select et impose cette restriction. Essayez ceci:

$db = Zend_Db::factory(...options...); 
$select = new Zend_Db_Select($adapter); 
$select->from('my_table_name')->join(... 

Si vous préférez, ce qui suit devrait être équivalente:

$db = Zend_Db::factory(...options...); 
$db->select()->from('my_table_name')->join(... 
+0

Cela a fonctionné comme je le voulais. Cependant, il semble retourner les résultats comme un tableau, plutôt que comme un objet? Pas un problème, je me demandais juste pourquoi. – Ross

+0

Il ne devrait pas, en fait. Comment exécutez-vous l'instruction select? $ select-> query() devrait renvoyer un PDO_Statement ou un Zend_Db_Statement. –

15

Vous pouvez également utiliser encore l'objet traditionnel select $ model->() en ajoutant setIntegrityCheck (false), ainsi.

$select = $table->select() 
->setIntegrityCheck(false) 
->from(array('m' => 'memberships'), array('b.id', 'b.title', 'b.description')) 
->join(array('b' => 'blogs'), 'b.id = m.blog_id') 
->where('m.user_id = ?', (int) $id) 
->order('m.created DESC') 
->limit(0, 30); 

Cela désactive la vérification qui jette l'exception:

#0: Select query cannot join with another table 
Questions connexes