Неоднозначный столбец на стороне сервера Codeigniter Datatables - PullRequest
0 голосов
/ 10 июля 2020

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

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

Любые предложения о том, как исправить это?

Заранее спасибо

РЕДАКТИРОВАТЬ: я добавил больше кода, чтобы процесс был лучше виден

1 Ответ

0 голосов
/ 10 июля 2020

Ошибка возникает из-за того, что имя вашего столбца не уникально, оно существует более чем в одной таблице.

добавьте имя таблицы искомого столбца к вашему запросу, чтобы сделать его уникальным:

например, в этой строке:

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

, что сгенерирует что-то вроде

ORDER BY `my_table_name.notes` DESC

edit: или в случае, если вам нужно адресовать столбцы из нескольких разных таблиц вы можете изменить свой массив $ 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.
);

и сохранить оставшийся исходный код.

...