【问题标题】:CodeIgniter Datatable joined search (json_encoded data)CodeIgniter Datatable 加入搜索(json_encoded 数据)
【发布时间】:2019-11-05 10:47:57
【问题描述】:

我有一个服务器端数据表,它从名为 leads 的表中获取一些结果。

在这个潜在客户表中,我有一个名为 permission 的列,它是 json_encoded;

示例:{"13":["view"]}

数字“13”与我的accounts 表中的 user_id 相关联。

搜索正在处理所有其他字符串字段,因此我决定创建某种 JOIN 语句,以便我也可以将该字段作为字符串读取。

当我意识到我不能真正将 JSON 数据作为一个简单的 ID 处理来创建 JOIN 语句时,我陷入了困境。 因此,类似于:

 if (!empty($this->db->field_exists('permission', $this->table))) {

     $this->db->join("accounts AS t2", "t2.user_id = leads.permission"); 

 }

不起作用,因为 t2.user_id 确实是一个数字,但 leads.permission 将是 json 编码字符串

如果您需要更多信息,我很乐意编辑我的帖子。

谢谢!

模棱两可的错误

 SELECT `tbl_leads`.`email` as `email`, `tbl_leads`.`contact_name` as `contact_name`, `tbl_leads`.`phone` as `phone`, `tbl_leads`.`lead_status_id` as `lead_status_id`, `tbl_leads`.`permission` as `permission`, `tbl_leads`.`linkedin` as `linkedin`, `tbl_leads`.`leads_id` as `leads_id`, `tbl_leads`.`converted_client_id` as `converted_client_id`, `t2`.`username` as `namexx`
FROM `tbl_leads`
JOIN `tbl_users` AS `t2` ON `t2`.`user_id` = JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(tbl_leads.permission), '$[0]'))
WHERE   (
`lead_name` LIKE '%w%' ESCAPE '!'
OR  `contact_name` LIKE '%w%' ESCAPE '!'
OR  `email` LIKE '%w%' ESCAPE '!'
OR  `phone` LIKE '%w%' ESCAPE '!'
OR  `lead_status_id` LIKE '%w%' ESCAPE '!'
OR  `permission` LIKE '%w%' ESCAPE '!'
OR  `namexx` LIKE '%w%' ESCAPE '!'
OR  `linkedin` LIKE '%w%' ESCAPE '!'
OR  `leads_id` LIKE '%w%' ESCAPE '!'
 )
AND `converted_client_id` = '0'
ORDER BY `leads_id` DESC
 LIMIT 20

这是由

创建的
   if ($this->table == 'tbl_leads') {

        //  $this->db->join("tbl_users AS t2", "t2.user_id = tbl_leads.permission"); 


         $this->db->select ( 
          'tbl_leads.email as email,
          tbl_leads.contact_name as contact_name,
          tbl_leads.phone as phone,
          tbl_leads.lead_status_id as lead_status_id,
          tbl_leads.permission as permission,
          tbl_leads.linkedin as linkedin,
          tbl_leads.leads_id as leads_id,
          tbl_leads.converted_client_id as converted_client_id,
          t2.username as namexx'); 

          $this->db->join("tbl_users AS t2", "t2.user_id = JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(tbl_leads.permission), '$[0]'))"); 



        }
        $query = $this->db->get();

【问题讨论】:

    标签: php mysql codeigniter datatables


    【解决方案1】:

    你可以结合使用MySQL JSON search functions

    if (!empty($this->db->field_exists('permission', $this->table))) {
    
        $this->db->join("accounts AS t2", "t2.user_id = JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(leads.permission), '$[0]'))"); 
    
    }
    

    首先JSON_KEYS 将json 键作为数组格式的字符串返回,然后JSON_EXTRACT 将其提取为字符串,最后JSON_UNQUOTE 将删除引号。

    【讨论】:

    • 太棒了,谢谢!知道如何进行连接,以免这两个字段被覆盖吗?现在,当我这样做时,我的“潜在客户”的电子邮件字段被帐户中的电子邮件字段覆盖。
    • 您可以简单地在select 查询中使用别名,例如$this->db->select('t2.*, leads.*, t2.email account_email, leads.email leads_email', false);?
    • 问题是,当我搜索某些内容时,我在 WHERE 中收到一个模棱两可的列名错误,即使我创建了一个别名,例如:leads_email as email。
    • 你可以查看我编辑的问题。 IF 是我要修改的唯一内容,因此我不必为此编辑整个搜索功能。
    • 所以这个tbl_users 表也有一个email 字段,对吗?也许这就是导致模棱两可的错误消息的原因?
    猜你喜欢
    • 1970-01-01
    • 2016-03-26
    • 2010-10-29
    • 2023-03-27
    • 2017-02-19
    • 2015-03-23
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多