Перевод запроса для использования Zend_Db_Select - PullRequest
7 голосов
/ 06 февраля 2009

У меня возникли проблемы с переводом этого запроса на использование ZF 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

(этот запрос работает и возвращает результаты)

Memberships - это таблица ссылок между blogs и users. Это простое дело | id | blog_id | user_id |.

Вот что у меня есть:

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

Это (странная (для меня)) ошибка, которую я получаю:

#0: Select query cannot join with another table

Произошло в строке 211 D:\...\library\Zend\Db\Table\Select.php.

Спасибо за вашу помощь.

Ответы [ 2 ]

15 голосов
/ 07 февраля 2009

Вы также можете использовать традиционный объект $ model-> select (), добавив setIntegrityCheck (false), например, так.

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

Это отключает проверку, которая вызывает исключение:

#0: Select query cannot join with another table
9 голосов
/ 06 февраля 2009

При извлечении из вашего объекта таблицы, оператор будет ограничен этой таблицей, я думаю. Методы Zend_Db_Table::select() возвращают объект Zend_Db_Table_Select, который является подклассом Zend_Db_Select, и налагают это ограничение. Попробуйте вместо этого:

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

Если вы предпочитаете, следующее должно быть эквивалентно:

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