Мы создаем приложение против Zend Framework 1.12.7 - один из наших разработчиков установил несколько более новую версию (1.12.9), и поведение Zend_Db_Table_Select (или Zend_Db_Select) немного изменилось и нарушает один из наших запросов.
В частности, мы имели:
$select->from("search", array(
"*",
"bodyScore" => $dbAdapter->quoteInto("MATCH(body) AGAINST (?)", $search),
"headingsScore" => $dbAdapter->quoteInto("MATCH(headings) AGAINST (?)", $search),
"titleScore" => $dbAdapter->quoteInto("MATCH(title) AGAINST (?)", $search),
));
$ search - строка, $ select - Zend_Db_Table_Select, а $ dbAdapter - Zend_Db_Adapter_Pdo_Mysql
В 1.12.7 это создаст следующий запрос:
SELECT
'search'.*,
MATCH(body) AGAINST ('neoral') AS 'bodyScore',
MATCH(headings) AGAINST ('neoral') AS 'headingsScore',
MATCH(title) AGAINST ('neoral') AS 'titleScore' FROM 'search' ...
В 1.12.9 он генерирует: SELECT search
. *, search
. MATCH(body) AGAINST ('neoral')
AS bodyScore
, search
. MATCH(headings) AGAINST ('neoral')
AS headingsScore
, search
. MATCH(title) AGAINST ('neoral')
AS titleScore
FROM search
...
Я понимаю принцип, лежащий в основе этого, и что это более правильный синтаксис в целом. Однако для этого конкретного запроса он MATCH(body) AGAINST ('neoral')
столбец MATCH(body) AGAINST ('neoral')
не найден в ошибках "field_list".
Каким будет (надеюсь, более правильный способ) построить мой запрос, чтобы он работал в 1.12.9?
В этом случае вы должны использовать Zend_Db_Expr
. Например, в вашем коде:
$select->from("search", array(
"*",
"bodyScore" => new Zend_Db_Expr($dbAdapter->quoteInto("MATCH(body) AGAINST (?)", $search)),
"headingsScore" => new Zend_Db_Expr($dbAdapter->quoteInto("MATCH(headings) AGAINST (?)", $search)),
"titleScore" => new Zend_Db_Expr($dbAdapter->quoteInto("MATCH(title) AGAINST (?)", $search)),
));