2012-04-06 2 views
14

JOIN이 포함 된 쿼리를 작성 중입니다. Active Record로 db 작업을 수행 한 것은 이번이 처음이며, 약간의 걸림돌을 맞았습니다. . 그러나CodeIgniter JOIN 문의 ActiveRecord 필드 이름

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; 
} 

: 나는 테이블에 가입 할

내가 성공적으로 그렇게 같은 이런 종류의 일을했습니다 그래서 나는 등 사용자가에있는 회사의 이름을 얻을 수있는 users 테이블에 companies라고 그 문제는 companies의 필드가 idname 인 것을 해당 개체에 간단히 name이라고 반환합니다.

일반적으로 원시 쿼리를 작성할 때 테이블에 별칭을 지정하면 결과는 u.company_id, c.name과 비슷합니다. 그래서 name은 사용자와 아무 관련이 없지만 물론 회사의 이름입니다. 그리고 현재는 아니지만 미래에는 잠재적으로 문제가되지는 않지만 id 열은 분명히 결과 집합에 공존 할 수 없으므로 하나를 덮어 씁니다!

특정 표의 입력란간에 이러한 구분을 어떻게 할 수 있습니까? 또는 테이블 조인 및 조인 된 쿼리 데이터 세트/개체로 작업하는 더 좋은 방법이 있습니까?

편집 : 대단한

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