字段名称'order'与Zend_Db_table_Abstract的mysql冲突?

时间:2013-10-17 15:04:03

标签: mysql zend-framework

不幸的是,我使用名为order的字段名称创建了表。

有没有办法更改查询构建器以确保字段名称包含在`(撇号' s)

我的查询如下:

               $select = $this->select();
                $select->order('order DESC');
                $select->where('order < ?', $row->menu_id);
                $select->where('menu_id = ?', $row->menu_id);

构建器创建:

SELECT `menu_items`.* 
FROM `menu_items` 
WHERE (order < '1') 
AND (menu_id = '1') 
ORDER BY `order` DESC LIMIT 1

我想创建

SELECT `menu_items`.* 
FROM `menu_items` 
WHERE (`order` < '1') 
AND (menu_id = '1') 
ORDER BY `order` DESC LIMIT 1

感谢

1 个答案:

答案 0 :(得分:1)

我不是专家,但根据docs

  

没有引用适用于where()orWhere()方法的表达式。如果您有需要引用的列名,则必须在形成条件的字符串时使用quoteIdentifier()

在“添加表达式列”部分中有一个使用quoteIdentifier()的示例:

$select = $db->select()
             ->from(array('p' => 'products'),
                    array('origin' =>
                              '(p.' . $db->quoteIdentifier('from') . ' + 10)')
                   );

所以你需要做这样的事情:

$db = Zend_Db_Table::getDefaultAdapter();
$select = $this->select();
$select->order('order DESC');
$select->where($db->quoteIdentifier('order') . ' < ?', $row->menu_id);
$select->where('menu_id = ?', $row->menu_id);

请注意,在order()方法中,

  

列名称作为标识符引用,除非它们包含括号或是Zend_Db_Expr类型的对象。

所以你不必在那里做任何特别的事。