2009-02-06 14 views
7

Estoy teniendo algunos problemas de traducción de esta consulta para utilizar de ZF Zend_Db_Select:Traducción de una consulta para utilizar 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 

(esta consulta funciona y devuelve los resultados)

Memberships es una tabla vínculo entre blogs y users. Es un asunto simple | id | blog_id | user_id |.

Esto es lo que tengo hasta ahora:

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

Este es el (extraño (para mí)) error que estoy consiguiendo:

#0: Select query cannot join with another table

Se produjo en la línea 211 de D:\...\library\Zend\Db\Table\Select.php.

Gracias por su ayuda.

Respuesta

9

Al recuperarlo de su objeto de tabla, la declaración se limitará a esa tabla, creo. Los métodos Zend_Db_Table::select() devuelven un objeto Zend_Db_Table_Select que es una subclase de Zend_Db_Select e impone esta restricción. Tal vez puedas probar:

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

Si lo prefiere, el siguiente debe ser equivalente:

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

Esto funcionó como yo quería. Sin embargo, parece devolver los resultados como una matriz, en lugar de como un objeto? No es un problema, solo me pregunto por qué. – Ross

+0

No debería, en realidad. ¿Cómo se ejecuta la instrucción select? $ select-> query() debería devolver un PDO_Statement o un Zend_Db_Statement. –

15

Usted también podría seguir utilizando el tradicional modelo- $> select() objeto añadiendo setIntegrityCheck (falso), al igual que.

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

Esto desactiva el cheque que está lanzando la excepción:

#0: Select query cannot join with another table 
Cuestiones relacionadas