2014-11-18 2 views
0

Мы создали приложение против Zend Framework 1.12.7 - один из наших разработчиков установил несколько более новую версию (1.12.9), а поведение Zend_Db_Table_Select (или Zend_Db_Select) немного изменился и нарушает один из наших поисков.Выбрать с помощью MATCH AGAINST перерывов в новой Zend Framework

В частности, у нас было:

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

$ поиск строка, $ выберите это 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, он генерирует: ВЫБОР search *, .. MATCH(body) AGAINST ('neoral') AS bodyScore, search. MATCH(headings) AGAINST ('neoral') AS headingsScore, search. MATCH(title) AGAINST ('neoral') AS titleScore ОТ search ...

Я понимаю принцип, лежащий в основе этого, и что это более правильный синтаксис в целом. Однако для этого конкретного запроса он выводит столбец MATCH(body) AGAINST ('neoral'), который не найден в ошибках «field_list».

Что будет (надеюсь, более правильным способом) построить мой запрос так, чтобы он работал в 1.12.9?

ответ

0

В этом случае вы должны использовать 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)), 
)); 
Смежные вопросы