Zend Framewrok 2: как написать пользовательский запрос с помощью tablegateway

#php #mysql #zend-framework2

#php #mysql #zend-framework2

Вопрос:

Мне нужно написать запрос на обновление в модели, которая использует tablegateway. Обновление запроса sql выглядит следующим образом.

 UPDATE `config_settings` SET `CS_value` = CASE `CS_option`
    WHEN 'CATEGORY_BANNER_MIN_WIDTH' THEN '$data->CATEGORY_BANNER_MIN_WIDTH'
    WHEN 'CATEGORY_BANNER_MAX_WIDTH' THEN '$data->CATEGORY_BANNER_MAX_WIDTH'
    WHEN 'CATEGORY_PROMOTION_MIN_WIDTH' THEN '$data->CATEGORY_PROMOTION_MIN_WIDTH'
    WHEN 'CATEGORY_PROMOTION_MAX_WIDTH' THEN '$data->CATEGORY_PROMOTION_MAX_WIDTH'
    WHEN 'PRODUCT_LARGE_IMAGE_WIDTH' THEN '$data->PRODUCT_LARGE_IMAGE_WIDTH'
    WHEN 'PRODUCT_MEDIUM_IMAGE_WIDTH' THEN '$data->PRODUCT_MEDIUM_IMAGE_WIDTH'
    WHEN 'PRODUCT_SMALL_IMAGE_WIDTH' THEN '$data->PRODUCT_SMALL_IMAGE_WIDTH'
    ELSE `CS_value`
END;
  

Я понятия не имею, как это реализовать. Метод обновления tablegateway принимает только массив имени поля таблицы и его значения. Итак, как написать этот запрос.

Я знаю, что могу выполнить этот запрос с помощью необработанного SQL-запроса db adapter, но я не хочу этого. Кроме того, иногда нам требуется выполнить какой-либо пользовательский запрос в методе выбора tablegateway. Но я не нашел стабильного способа в tablegateway.

Например:

 select sum(CASE WHEN answers.type = 'his' THEN 1 ELSE 3 END) AS totalScore  
FROM users_questions_answers join answers on cast(answers.id as int(8))= 
users_questions_answers.answer_id group by users_questions_answers.user_id
  

Как я могу поступить в этой ситуации. Любое экспертное предложение zend 2 будет высоко оценено.
Спасибо за ваше любезное внимание.

Ответ №1:

Попробуйте это —

 $this->tablegateway->update(array('CS_value' => new ZendDbSqlExpression('CASE CS_option
    WHEN "CATEGORY_BANNER_MIN_WIDTH" THEN ?
    WHEN "CATEGORY_BANNER_MAX_WIDTH" THEN ?
    WHEN "CATEGORY_PROMOTION_MIN_WIDTH" THEN ?
    WHEN "CATEGORY_PROMOTION_MAX_WIDTH" THEN ?
    WHEN "PRODUCT_LARGE_IMAGE_WIDTH" THEN ?
    WHEN "PRODUCT_MEDIUM_IMAGE_WIDTH" THEN ?
    WHEN "PRODUCT_SMALL_IMAGE_WIDTH" THEN ?
    ELSE CS_value END', 
    array($data->CATEGORY_BANNER_MIN_WIDTH, $data->CATEGORY_BANNER_MAX_WIDTH, $data->CATEGORY_PROMOTION_MIN_WIDTH, $data->CATEGORY_PROMOTION_MAX_WIDTH, $data->PRODUCT_LARGE_IMAGE_WIDTH, $data->PRODUCT_MEDIUM_IMAGE_WIDTH, $data->PRODUCT_SMALL_IMAGE_WIDTH))));
  

Если CATEGORY_BANNER_MIN_WIDTH в запросе используются некоторые константы, просто удалите double quotes их вокруг.

Я попробовал аналогичный запрос, приведенный выше, и он работает просто отлично.

Комментарии:

1. Пытался без двойных кавычек. Но выдает следующую ошибку. Неизвестный столбец ‘CATEGORY_BANNER_MIN_WIDTH’ в ‘списке полей. Это означает, что запрос на обновление указывает CATEGORY_BANNER_MIN_WIDTH в качестве поля таблицы. Для вашей информации, CATEGORY_BANNER_MIN_WIDTH — это значение поля.

2. Спасибо, что сообщили мне об этом. Какую ошибку вы получаете при выполнении запроса с двойными кавычками на месте? Например: какая-то ошибка в поле ИЛИ нет ошибки без обновления. Дело в том, что я выполнил аналогичный запрос, AlbumTable чтобы обновить title , когда artist имя есть SOME_NAME , и это сработало, поэтому мне немного любопытно узнать о вашем запросе.