使用DataMapper的1.8.1-dev通过PHP的笨,我试图建立这样的查询到一个国家的名字在名单之上优先考虑:
SELECT * FROM countries
ORDER BY CASE name WHEN 'Australia' THEN 1 ELSE 2 END, name
PHP在我的国家模型(延伸的DataMapper):
$countries = new Country();
$countries->order_by("CASE name WHEN 'Australia' THEN 1 ELSE 2 END, name");
$countries->get_iterated();
DataMapper的,而不是解析“CASE”作为表名,建立这个语法错误查询:
SELECT * FROM (`countries`)
ORDER BY `CASE` name WHEN 'Australia' THEN 1 ELSE 2 END, `countries`.`name`
我假设CASE情况下,不被处理,因为这种流控制语句在MySQL 5只添加? 是我唯一的选择到任何一个添加order_by
列到countries
表或使用数据库检索后PHP排序功能?
DataMapper的的order_by()
仅仅是一个别名$this->db->order_by()
不幸的是,按照CodeIgniter的文档 ,数据库类是唯一是不可扩展。 你将不得不通过修改核心让你的手脏。
头到system/database/DB_active_rec.php
和搜索order_by()
函数。 第三个参数添加到函数的函数定义:
function order_by($orderby, $direction = '', $case = null)
滚动到功能的底部...只是在分配前$orderby_statement
至$this->ar_orderby[]
写:
if($case===true) $orderby_statement = "CASE " . $orderby_statement;
保存文件和头到application/libraries/datamapper.php
和搜索order_by()
函数。 请注意,这只是一个包装!
其替换为:
public function order_by($orderby, $direction = '', $case = null)
{
$this->db->order_by($this->add_table_name($orderby), $direction, $case);
//For method chaining
return $this;
}
现在,在你的控制,如果你通过true
的第三个参数来order_by()
丢弃从第一串PARAM CASE关键字,你应该得到正确的语法。
希望这可以帮助。
我能够通过才能使用case语句。 你只需要包装case语句在括号中。 如果你没有这个词的情况下被视为列名,后引号。
$this->db->distinct();
$this->db->select('country');
$this->db->from('distributors');
$this->db->where('country != ', '');
$this->db->order_by("(CASE country WHEN 'UNITED STATES OF AMERICA' THEN '1' ELSE country END)");
由于DataMapper的不支持MySQL的CASE关键字,直接的解决方法是使用调用SQL query()
方法:
$sql = "SELECT * FROM `countries` ORDER BY CASE `name` WHEN 'Australia' THEN 1 ELSE 2 END, `name`";
$countries = new Country();
$countries->query($sql);
文章来源: Does CodeIgniter Datamapper ORM support a MySQL CASE statement in ORDER BY clauses?