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);但现在尝试订购桌子时其他人失败了 所以它确实适用于notes
now?正确的?好吧,我的回答是让您知道错误背后的原因,即模棱两可的列名。现在您必须检查代码中列的歧义,具体取决于您的数据库结构以上是关于Codeigniter Datatables 服务器端的模棱两可的列的主要内容,如果未能解决你的问题,请参考以下文章
DataTables TableTools 插件 - 如何在 Codeigniter 中配置 sSwfPath 路径?
CodeIgniter 或 Ignite Datatables 中的长尾 where 子句
Codeigniter:this->datatables->select(sample)->from(sample)->where()
或在我的 SQL 查询(使用 CodeIgniter 生成)中不使用 jQuery DataTables