CodeIgniter Datatable объединенный поиск (json_encoded data) - PullRequest
0 голосов
/ 23 июня 2019

У меня есть база данных на стороне сервера, которая получает некоторые результаты из таблицы с именем leads.

В этой таблице потенциальных клиентов у меня есть столбец с именем permission, который является json_encoded;

пример: {"13":["view"]}

Число '13' связано с user_id из моей таблицы accounts.

Поиск работает по всем остальнымполя, которые являются строками, поэтому я решил сделать своего рода оператор JOIN, чтобы я мог также читать это поле как строку.

Я застрял, когда понял, что не могу действительно обработать эти данные JSON какпростой идентификатор для создания оператора 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();

1 Ответ

0 голосов
/ 23 июня 2019

Вы можете комбинировать использование функций поиска MySQL JSON :

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 удалит кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...