【问题标题】:PostgreSQL column casting in Codeigniter for datatablesCodeigniter 中用于数据表的 PostgreSQL 列转换
【发布时间】:2018-08-31 02:07:27
【问题描述】:

我目前正在开发一个 Codeigniter 3 项目,该项目使用数据表进行实时搜索值,该项目在 MySQL 上并且一切正常,它必须迁移到 PostgreSQL,现在搜索不起作用,因为需要要在 ID 列中添加显式类型转换,这是错误:ERROR: operator does not exist: integer ~~ text.

我想出了如何通过在 de 列名之后添加 ::varchar 来实现它,我测试了它直接在 PHPpgadmin 上输入查询并且它可以工作,但我找不到我到底是怎么做到的在 CI 代码中执行此操作

这是代码

$datatable->db_search(array(
        "consultas.nombre",
        "usuarios.username",
        "u2.username",
        "consultas.guest_email",
        "consultas.last_reply_string",
        "consultas.ID",
    )
);

db_search 函数

public function db_search($columns) 
{
    if(!empty($this->search)) {
        if($this->search_type == 0) {

            // Search all columns for likeness
            $words = explode(" ", $this->search);
            $this->CI->db->group_start();
            foreach($words as $word) {
                foreach($columns as $field) {
                    $this->CI->db->or_like($field, $word);
                }
            }
            $this->CI->db->group_end();

        } elseif($this->search_type == 1) {

            // Search all colums for likeness for whole string
            $this->CI->db->group_start();
            foreach($columns as $field) {
                 $this->CI->db->or_like($field, $this->search);
            }
            $this->CI->db->group_end();

        } else {

            // Search for each individual column. 
            // First 2 indexes are reserved for above
            if(isset($columns[$this->search_type-2])) {
                $this->CI->db->group_start();
                $this->CI->db->or_like($columns[$this->search_type-2],  $this->search);
                $this->CI->db->group_end();
            }
        }
    }
}

已经试过了:

"consultas.ID::varchar",

"'consultas.ID', '1011%'"

【问题讨论】:

  • 请发$datatable->db_search()的代码

标签: postgresql codeigniter codeigniter-3


【解决方案1】:

您需要避免在您正在投射的那些列中转义。

通常 QueryBuilder 方法的最后一个参数用于转义,可以是 true 或 false(默认:true,DO escape)

$this->CI->db->or_like($field, $word, false); // <-- false, do not escape

在此处查看我对类似问题的回答: type "e" does not exist , Redshift through Postgresql connector in php codeigniter


尝试以这种方式投射

CAST(consultas.ID as TEXT);

【讨论】:

  • 我试过了,但错误仍然存​​在,我实际上也希望能够通过 ID 进行搜索,谢谢
  • @AlfredoSanroman 在返回结果之前将echo $this-&gt;db-&gt;last_query(); 并在此处发布完整的查询。
  • 为什么需要像整数列一样搜索?
  • 嗨,现在我得到了一个不同的错误:pastebin.com/N8pDgE3U,由于某种原因将该列称为consulta.id 而不是consulta.ID
  • 用引号可能更好CAST("consultas"."ID" as TEXT)(我不确定,我这里没有PG可以测试)
【解决方案2】:

为consultas.ID 设置or_like 的第三个参数为FALSE。

if($field == 'consultas.ID')
{
$this->CI->db->or_like($field, $word, FALSE);
}
else{
$this->CI->db->or_like($field, $word);
}

【讨论】:

  • 您好,感谢您的回复,问题仍然存在,我这样设置: // 搜索所有列的相似度 $words = explode(" ", $this->search); $this->CI->db->group_start(); foreach($words as $word) { foreach($columns as $field) { if($field == 'consultas.ID') { $this->CI->db->or_like($field, $word, FALSE ); } else{ $this->CI->db->or_like($field, $word); } } $this->CI->db->group_end(); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 2023-01-04
  • 2016-08-13
  • 1970-01-01
  • 2023-01-17
相关资源
最近更新 更多