2009-02-06 9 views
7

Mam pewne problemy tłumaczenia tej kwerendy w użyciu ZF na Zend_Db_Select:Przełożenie zapytanie do korzystania 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 

(ta kwerenda działa i zwraca wyniki)

Memberships jest stół związek między blogs i users. To prosta sprawa z | id | blog_id | user_id |.

Oto co mam do tej pory:

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

Jest to (dziwne (dla mnie)) Błąd Dostaję:

#0: Select query cannot join with another table

doszło na linii 211 D:\...\library\Zend\Db\Table\Select.php.

Dzięki za pomoc.

Odpowiedz

9

Po pobraniu z obiektu tabeli instrukcja będzie ograniczona do tej tabeli. Metoda Zend_Db_Table::select() zwraca obiekt Zend_Db_Table_Select, który jest podklasą Zend_Db_Select i narzuca to ograniczenie. Spróbuj to zamiast:

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

Jeśli wolisz, następujące powinny być równoważne:

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

To działało jak chciałem go. Jednak wydaje się, że wyniki są zwracane jako tablica, a nie jako obiekt? Nie stanowi problemu, tylko zastanawiam się, dlaczego. – Ross

+0

Właściwie to nie powinno. Jak wykonać instrukcję select? $ select-> query() powinno zwrócić wartość PDO_Statement lub Zend_Db_Statement. –

15

Można też nadal korzystać z tradycyjnych model- $> select() obiektu poprzez dodanie setIntegrityCheck (fałsz), tak jak.

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

ta wyłącza sprawdzanie który rzuca wyjątek:

#0: Select query cannot join with another table