Как устранить эту неуникальную ошибку таблицы при запросе базы данных из CodeIgniter - PullRequest
0 голосов
/ 21 августа 2011

Следующий код выдает следующее сообщение об ошибке:

A Database Error Occurred
Error Number: 1066
Not unique table/alias: 'users'

SELECT * FROM (`users`, `users`) JOIN `user_profiles` ON `users`.`id` = `user_profiles`.`user_id`

Filename: /home/xtremer/public_html/kowmanager/models/cpanel/dashboard.php

Line Number: 38

Вот мой код:

class Dashboard extends CI_Model {
  private $table_name = 'users'; // user accounts
  private $profile_table_name = 'user_profiles'; // user profiles

  function __construct() {
    parent::__construct();
    $ci =& get_instance();
    $this->table_name = $ci->config->item('db_table_prefix', 'tank_auth').$this->table_name;
    $this->profile_table_name = $ci->config->item('db_table_prefix', 'tank_auth').$this->profile_table_name;
  }

 /**
  * Get user info by Id
  *
  * @param int
  * @param bool
  * @return object
  */
  function get_user_info($id) {
    $this->db->select('*');
    $this->db->from('users');
    $this->db->join('user_profiles', 'users.id = user_profiles.user_id');

    $query = $this->db->get($this->table_name);
    if ($query->num_rows() == 1) {
      return $data = $query->row();  
    }  else {
     return NULL;  
    }
  }
}

РЕДАКТИРОВАТЬ: Я знаю, есть это для моей функции и изменил его, потому что послеглядя на это мне не нужен дополнительный стол.У меня есть массив ($ data) значений, отправляемых в мой заголовок, но могу ли я уйти, отправив его в сборку таким образом, чтобы он отправлял массив всем частям.

function get_user_info($id)
{
    $this->db->select('*');
    $this->db->from('users');
    $this->db->where('users.id', $id);

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

    if ($query->num_rows() == 1) 
    {
        return $data = $query->row();    
    }
    else 
    {
        return NULL;    
    }

}   

И это измой контроллер я обновил:

function index()
{
    $id = $this->tank_auth->get_user_id();

    $data = $this->Dashboard->get_user_info($id);
    print_r($data);
    $this->template->set_layout('cpanel')->enable_parser(false);
    $this->template->set_partial('header', 'partials/header', $data);  
    $this->template->set_partial('sidebar', 'partials/sidebar');  
    $this->template->set_partial('content', 'partials/content');      
    $this->template->set_partial('footer', 'partials/footer');
    $this->template->build('/cpanel/index');
}

Ответы [ 2 ]

3 голосов
/ 21 августа 2011

Проблема заключается в следующем:

SELECT * FROM (users, users)

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

Попробуйте:

SELECT * 
FROM users u1, users u2 
JOIN user_profiles ON u1.id = user_profiles.user_id

Обновление:

Мой ответ выше был написан на основе сообщения об ошибке, но я не заметил ссылку на код (с тех пор я добавил код, чтобы включить его в вопрос).

Я не слишком знаком с CIНо я чувствую, что ваша проблема заключается в следующих трех строках:

  1. private $table_name = 'users';
  2. $this->db->from('users');
  3. $query = $this->db->get($this->table_name);

В строке 3 вы явно get ting $this->table_name, который указывает на таблицу users, как показано в строке 1).Однако, явно указав в строке 2 таблицу from, также указанную на users, я думаю, что вы случайно настраиваете соединение между двумя таблицами.Поскольку обе эти таблицы одинаковы и не имеют псевдонимов, это приводит к ошибке.Попробуйте удалить строку $this->db->from('users'); и посмотреть, решит ли это проблему.

Обновление 2:

Я читал Руководство пользователя CodeIgniter и, похоже, вам не нужно ничего указывать в качестве параметра для $this->db->get(), когда вы используете построение запроса с использованием таких методов, как from().Я бы предложил просто изменить эту строку:

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

на эту:

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

Подробнее см. на этой странице .

1 голос
/ 21 августа 2011

Вы берете с собой декартово произведение таблицы пользователей, когда пишете users,users, но не даете ни одному из них псевдоним. Я не думаю, что вы хотите взять декартово произведение вообще. Попробуйте:

SELECT * FROM users JOIN user_profiles ON users.id = user_profiles.user_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...