是否笨DataMapper的ORM支持MySQL的CASE语句中ORDER BY子句?(Does C

2019-07-30 19:06发布

使用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排序功能?

Answer 1:

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关键字,你应该得到正确的语法。

希望这可以帮助。



Answer 2:

我能够通过才能使用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)");


Answer 3:

由于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?