2013-08-05 1 views
1

В принципе, у меня есть это соглашение о кодировании, что любой первичный ключ, являющийся идентификатором, я назову названием столбца «id». Так вот моя проблема. Я присоединяюсь к двум таблицам, и вместо первой таблицы получаю идентификатор второй таблицы. Я знаю, что если я использую select «artist.id, ...», это сработает, но я хочу знать, есть ли исправление с использованием «select *», которое было бы лучше для будущего расширения (появятся новые colums ...) ,CodeIgniter PHP - Как выбрать, какой идентификатор выбрать в соединении при использовании «select *»

Вот моя модель:

$this->db->select('*'); 
$this->db->from('artists'); 
$this->db->join('categories', 'artists.category_id = categories.id'); 
$this->db->where('id', $id); 
$this->db->limit(1); 

С print_r я могу видеть, я получаю все колонки (но только 1 идентификатор, который из категорий таблицы вместо таблицы художников) без префикса таблицы.

+1

Нет. Избегайте «ВЫБРАТЬ *». – Strawberry

ответ

3

Вы должны квалифицироваться столбцы с алиаса таблицы

$this->db->select('a.id as artist_id, c.id as category_id, a.column2,c.column3'); 
$this->db->from('artists a'); 
$this->db->join('categories c', 'a.category_id = c.categories.id'); 
$this->db->where('a.id', $id); 
$this->db->limit(1); 

Если вы хотите продолжать использовать SELECT *

$this->db->select('a.*, c.*, a.id as artist_id, c.id as category_id'); 
$this->db->from('artists a'); 
$this->db->join('categories c', 'a.category_id = c.categories.id'); 
$this->db->where('a.id', $id); 
$this->db->limit(1); 

Имейте в виду, что в последний столбец дубликат будет возвращен. Итак, a.*,c.* вернет c.id, так как id и c.*,a.* вернет a.idid.

+0

Побей меня. Хороший ответ – envysea

+0

вы всегда можете отредактировать мой ответ и добавить ссылки для ссылки;) – user20232359723568423357842364

+0

Хм хорошо, я знал это: D. Мне было интересно, есть ли способ сделать это, используя «select *»: P. Так что, наверное, нет? –

0

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