#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
, и это сработало, поэтому мне немного любопытно узнать о вашем запросе.