У меня есть 2 таблицы:
область, край: region_id, name, state_id
государство: state_id, name
Я хочу оба имени в моем результате, state.name переименован в StateName.
Пока я получил это:
$select = $select->from(array('r' => 'region'))->join(array('s' => 'state'),
'r.state_id = s.state_id',array("statename" =>"r.name"));
что приводит к следующему запросу:
SELECT `r`.*, `r`.`name` AS `statename` FROM `region` AS `r`
INNER JOIN `state` AS `s` ON r.state_id = s.state_id
Так что мне просто нужно изменить r.name AS statename
в s.name AS statename
.
Но я не могу заставить его работать. Если я изменю последнюю часть выбора на array("statename" =>"s.name")
я получаю ошибку
Select query cannot join with another table
Итак, как я могу переименовать поле в соединительной таблице?
Вы должны удалить проверку целостности.
$table = new self();
$select = $table->select()->setIntegrityCheck(false);
$select = $select->from(array('r' => 'region'))->join(array('s' => 'state'),'r.state_id = s.state_id',array("statename" =>"s.name"));
Проверка целостности предназначена для того, чтобы убедиться, что ваш запрос не будет использовать столбцы из другой таблицы, поэтому объекты Zend_Db_Table_Row могут быть обновлены, сохранены или удалены. Если вы удалите целостность, вы скажете Zend, что знаете, что делаете, и хотите использовать столбцы из другой таблицы.
Вот краткое объяснение из документации:
Zend_Db_Table_Select в основном используется для ограничения и проверки
так что он может применять критерии для допустимого запроса SELECT. тем не мение
могут быть определенные случаи, когда вам требуется гибкость
Компонент Zend_Db_Table_Row и не требует записи или удаления
строка. для этого конкретного случая пользователя можно получить строку или
набор строк путем передачи значения FALSE в setIntegrityCheck (). Результирующий
строка или набор строк будут возвращены как «заблокированная» строка (то есть save (),
delete () и любые методы установки полей будут вызывать исключение).
Других решений пока нет …