Zend框架2:如何使用表网关编写自定义查询


Zend Framewrok 2: How to write custom query using tablegateway

我需要在一个使用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的更新方法只接受表字段名及其值的数组。那么如何写这个查询呢。

我知道我可以使用db适配器原始sql查询执行此查询,但我不想这样。除此之外,有时我们还需要在tablegateway的select方法中进行一些自定义查询。但是我没有找到稳定的方法。

例如:

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专家的建议都将非常感谢。谢谢您的关照。

试试这个-

$this->tablegateway->update(array('CS_value' => new 'Zend'Db'Sql'Expression('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

我已经尝试了一个类似的查询上面的一个,它工作得很好。