Codeigniter Datatables 服务器端的模棱两可的列

Posted

技术标签:

【中文标题】Codeigniter Datatables 服务器端的模棱两可的列【英文标题】:Ambiguous column in Codeigniter Datatables server side 【发布时间】:2020-10-30 14:07:59 【问题描述】:

我正在开发一个具有多个服务器端数据表的系统,但是当我尝试订购 de 列时遇到了 2 个连接的问题。

我在尝试对列进行排序时收到以下消息:

Query error: Column 'notes' in order clause is ambiguous - Invalid query: SELECT *
FROM `tbl_project`
LEFT JOIN `tbl_client` ON `tbl_project`.`client_id`=`tbl_client`.`client_id`
LEFT JOIN `tbl_account_details` ON `tbl_project`.`created_by` = `tbl_account_details`.`user_id`
LEFT JOIN `tbl_notes` ON `tbl_project`.`notes` = `tbl_notes`.`notes_id`
WHERE `tbl_project`.`client_id` = '100'
ORDER BY `notes` DESC
 LIMIT 10

这是我的查询代码:

    $id = $this->input->post("client_id");
    $client_details = get_row('tbl_client', array('client_id' => $id));
    $draw = intval($this->input->post("draw"));
    $start = intval($this->input->post("start"));
    $length = intval($this->input->post("length"));
    $order = $this->input->post("order");
    $search= $this->input->post("search");
    $search = $search['value'];
    $col = 0;
    $dir = "";
    if(!empty($order))
    
        foreach($order as $o)
        
            $col = $o['column'];
            $dir= $o['dir'];
        
    

    if($dir != "desc" && $dir != "desc")
    
        $dir = "desc";
    
    $valid_columns = array(
        0=>'project_id',
        1=>'client',
        2=>'fullname',            
        3=>'notes',
        4=>'origen',
        5=>'end_date',
        6=>'project_status',
        7=>'action',
    );
    if(!isset($valid_columns[$col]))
    
        $order = null;
    
    else
    
        $order = $valid_columns[$col];
    
    if($order !=null)
    
        $this->db->order_by($order, $dir);
    
    
    $searchQuery = "";
    if($search != '')
    $searchQuery = " (tbl_project.project_id like'%".$search."%' OR tbl_project.end_date like'%".$search."%' OR tbl_project.project_status like'%".$search."%' OR tbl_notes.notes like'%".$search."%' OR tbl_notes.eco like'%".$search."%' OR tbl_account_details.origen like'%".$search."%' OR tbl_client.name like'%".$search."%') ";
      

$this->db->select('*');
    $this->db->from('tbl_project');
    $this->db->join('tbl_client', 'tbl_project.client_id=tbl_client.client_id','left');
    $this->db->join('tbl_account_details', 'tbl_project.created_by = tbl_account_details.user_id','left');
    $this->db->join('tbl_notes', 'tbl_project.notes = tbl_notes.notes_id','left');
    $this->db->where('tbl_project.client_id', $client_details->client_id);
    if($searchQuery != '')
    $this->db->where($searchQuery);
    $this->db->limit($length,$start);
    $cita = $this->db->get()->result();

由于某种原因,ORDER BY 未设置为 tbl_notes.notes

关于如何解决此问题的任何建议?

提前致谢

编辑:我添加了更多代码,因此流程更加可见

【问题讨论】:

你能告诉我们$searchQuery吗,目前我看不到 ORDER BY 来自哪里 添加了更多代码,谢谢 【参考方案1】:

出现错误,因为你的列名不是唯一的,它存在于多个表中。

将搜索列的表名附加到您的查询中以使其唯一:

例如在这一行:

$this->db->order_by('my_table_name.'.$order, $dir);

这会产生类似的东西

ORDER BY `my_table_name.notes` DESC

编辑: 或者如果您必须处理来自多个不同表的列,您可以更改 $valid_columns 数组:

$valid_columns = array(
    0=>'my_table_name1.project_id',
    1=>'my_table_name2.client',
    2=>'my_table_name2.fullname',            
    3=>'my_table_name3.notes',
    // etc.
);

并维护剩余的原始代码。

【讨论】:

试试 $this->db->order_by('tbl_project.'.$order, $dir);但现在尝试订购桌子时其他人失败了 所以它确实适用于notesnow?正确的?好吧,我的回答是让您知道错误背后的原因,即模棱两可的列名。现在您必须检查代码中列的歧义,具体取决于您的数据库结构

以上是关于Codeigniter Datatables 服务器端的模棱两可的列的主要内容,如果未能解决你的问题,请参考以下文章

DataTables TableTools 插件 - 如何在 Codeigniter 中配置 sSwfPath 路径?

CodeIgniter 或 Ignite Datatables 中的长尾 where 子句

Codeigniter:this->datatables->select(sample)->from(sample)->where()

或在我的 SQL 查询(使用 CodeIgniter 生成)中不使用 jQuery DataTables

如何修复 php codeigniter 中的 DataTables 分页和搜索框?

使用 Codeigniter 进行数据表服务器端处理