Хорошо, я провел какое-то исследование, и не совсем верно , что вы должны позвонить setIntegrityCheck(FALSE)
, чтобы сделать соединение.
Соответствующий код в классе Zend_Db_Select
(т. Е. Единственное место, где можно найти самое последнее слово для этого аргумента), содержит этот код:
if ($this->_integrityCheck !== false) {
foreach ($fields as $columnEntry) {
list($table, $column) = $columnEntry;
// Check each column to ensure it only references the primary table
if ($column) {
if (!isset($from[$table]) || $from[$table]['tableName'] != $primary) {
require_once 'Zend/Db/Table/Select/Exception.php';
throw new Zend_Db_Table_Select_Exception('Select query cannot join with another table');
}
}
}
}
Таким образом, на самом деле он проверяет, все ли выбранные поля в запросе принадлежат «первичной таблице». Запрос не обязательно должен возвращать все поля в задействованных таблицах.
Возвращаясь к примеру в моем вопросе, получается, что работает :
$table = new Zend_Db_Table('tableB');
$select = $table->select(TRUE)
->join(array('a' => 'tableA'), 'tableB.tableA_id = a.id', NULL); // <-- notice the third parameter here
$result = $table->fetchAll($select);
Этот новый запрос возвращает поля только из tableB
, но вы можете добавить where
условия для любой из таблиц, как вы обычно делаете с SQL, без проблем.