2012-04-06 5 views
14

Я создаю запрос с участием JOIN. Это первый раз, когда я сделал db-файл с Active Record, и я немного ударил.Имена полей CodeIgniter ActiveRecord в инструкции JOIN

Я хочу присоединиться к столу под названием companies к users столу, так что я могу получить название компании и т.д. находится пользователь я сделал такого рода успешно, как так:.

function get_profile_by_username($username) 
{ 
    $this->db->join('companies', $this->table_name.'.company_id = companies.id'); 
    $this->db->where('LOWER(username)=', strtolower($username)); 
    $query = $this->db->get($this->table_name); 
    if ($query->num_rows() == 1) return $query->row(); 
    return NULL; 
} 

Однако проблема заключается в том, что поля в companies, они id и name возвращаются в этом объекте, как просто называемый name.

Обычно, когда я писал бы сырой запрос, я бы дал псевдонимы таблицам, и результат был бы чем-то вроде u.company_id, c.name. Поэтому я бы знал, что name не имеет ничего общего с пользователем, но, конечно же, это название компании. И хотя это не проблема сейчас, а потенциально в будущем, столбец id, очевидно, не может сосуществовать в результирующем наборе, поэтому можно перезаписать!

Как мы можем получить такое различие между полями, которые поступают из определенных таблиц? Или есть лучший способ перейти к объединению таблиц и работать со связанными наборами данных/объектами данных?

Edit:

Если бы я делал это в качестве исходного запроса я хотел бы сделать:

SELECT u.id, u.username, c.name 
FROM users AS u 
JOIN companies AS c 
ON c.id = u.company_id 
WHERE u.username = 'foobar'; 

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

ответ

36

Если вы хотите выбрать некоторые конкретные столбцы из таблицы, используйте db->select(). Вы можете дать псевдоним таблицам, добавить некоторые условия и т. Д. Отправить второй параметр FALSE, чтобы избежать специальных символов.

$this->db->select('u.id, u.username, c.name', false); 
$this->db->from('user as u'); 
$this->db->join('companies as c', 'u.company_id = c.id'); 
$this->db->where('LOWER(u.username)=', strtolower('foobar')); 
$query = $this->db->get(); 
+0

Я думал, что, возможно, мне придется прибегнуть к этому, но я не был уверен, что смогу так выбрать. Как мне дать псевдонимы таблицам, как мой пример, что-то вроде '-> get ('user AS u')'? Будет ли это совместимо со всеми целями базы данных activerecord? – deed02392

+0

@ deed02392 проверить, обновленный код – safarov

+0

ОК, как я и думал. Оператор «AS» является стандартным правом SQL, он устанавливает псевдоним на всех языках db? Или это будет работать только в certiain db. – deed02392

Смежные вопросы