2011-07-06 2 views
1

Model 클래스에서 나는 단일 행을 반환하는 데 return $query->row();을 사용하고 여러 행을 반환 할 때는 return $query->result();을 사용합니다.Codeigniter 반환 결과 및 행

단일 페이지에서 두 개의 개별 테이블에서 단일 행과 여러 행을 반환해야합니다.

users에는 사용자 이름, 성명 및 전자 메일 주소와 같은 일반 정보가 들어 있습니다. 표 user_links에는 해당 사용자가 제출 한 링크가 들어 있으며 각 사용자마다 여러 행이 있습니다. 내 컨트롤러에서

내 쿼리

 $this->db->select('*'); 
     $this->db->from('users'); 
     $this->db->join('user_links', "user_links.user_id = users.user_id"); 
     $this->db->where('users.user_id', $user_id); 
     $this->db->where('user_links.user_id', $user_id); 
     $query = $this->db->get(); 
     return $query->row(); 

나는 고유 한 사용자 ID를 포함하는 3 URL 세그먼트 인

$user_id,

$data['row'] = $this->User_model->user_read($user_id);으로 내보기에서 쿼리를로드합니다.

마지막으로, 내보기에 나는이 단일 행에 대한 작동 echo $row->first_name;

하여 행을 검색하지만 어떻게 내가 사용자 링크에 대한 foreach 루프를 만들 수 있습니까? 목표는 단일 행에 대한 루프를 피하고 단지 여러 행을 검색하는 데 사용하는 것입니다.

답변

2

과 같은 작업을 수행 할 수 있습니다, 당신이 원하는 단일 쿼리로 사용자 데이터와 user_links 데이터를 모두 가져 와서 반복하여 사용자 데이터를 가져 오는 것을 피하십시오. 이것이 result_array를 사용하여 가능할 수도 있지만, 특정 사용자에 대한 user_links에 항목이 없을 때 결과가 0이 될 것이기 때문에 나는 반대합니다.

나의 제안은 두 개의 쿼리를 사용하여 하나는 사용자 테이블에서 사용자를 얻고 다른 하나는 user_links 테이블에서 사용자의 링크를 가져 오는 것입니다. 또한 조인을 피할 수 있습니다.

당신은 단지이 줄을 바꿀 수 있습니다
+0

고마워! 두 쿼리를 사용하여 컨트롤러에서 보았지만 조인은 더 전문적으로 보였습니다. – CyberJunkie

1

원하는 것을 말하기가 어렵습니다.

row() 또는 result()을 전달하는지 확인하고 적절히 처리하는 기능이 필요합니다.

result()으로 모든 것을 전달한 경우 코드를 읽기 쉽고 유지 관리하기가 쉽습니다. 그리고 사용자에게 멋진 메시지를 보여주기 위해 세트가 비어 있는지 확인하십시오. 당신이 그 일을하는 것은이 기능 result_array에 내장 된 작동합니다 사용하여 같은 소리 http://codeigniter.com/user_guide/database/results.html

를 들어 : 이미 CI의 액티브 레코드에서 제공하는 다른 기능의 일부를 찾고있는 것처럼

1

는 소리. 당신은 너무처럼 사용

$query = $this->db->query("YOUR QUERY"); 

foreach ($query->result_array() as $row) 
{ 
    echo $row['title']; 
    echo $row['name']; 
    echo $row['body']; 
} 
+0

제안 해 주셔서 감사합니다. 'result_array'는 모델에서'result()'를 리턴하는 것과 같지 않습니까? 객체 형식은 순수 배열보다 깔끔합니다. – CyberJunkie

+0

예 배열 형식으로 만 같은 것입니다. 나는 네가 정말로 묻고있는 것을 오해 했음에 틀림 없다. 당신이 원하는 것을 정확히 분명히 해줄 수 있습니까? – Obto

+0

내 모델의'row()'와'result()'를 컨트롤러로 보내고보기 위해 뷰에서 하나의 행에'echo $ row-> some_value;'를 사용하거나 데이터베이스를 통해 데이터를 검색하고 싶습니다. 'result()'함수 – CyberJunkie

5

이 사이비 코드입니다 위의 링크에서 가져하지만 난 제대로 질문을 이해한다면 당신은 probobly이

$this->db->select('*'); 
    $this->db->from('users'); 
    $this->db->join('user_links', "user_links.user_id = users.user_id"); 
    $this->db->where('users.user_id', $user_id); 
    $this->db->where('user_links.user_id', $user_id); 
    $query = $this->db->get(); 
    if ($query->num_rows() == 1) 
    { 
     return $query->row(); 
    } 
    elseif ($query->num_rows() > 1) 
    { 
     return $query->result_array(); //This returns an array of results which you can whatever you need with it 
    } 
    else 
    { 
     //Add some logic to handle if there are zero results 
    } 
+0

행이 한 테이블에서 같고 다른 테이블에서 행이 1이되도록 테이블을 조인하면 row()와 result()를 모두 반환해야합니다. 나는 if 문을 뷰에 추가해야한다고 생각한다. – CyberJunkie

+0

그때 당신의 질문을 이해하지 못했을 것입니다,하지만 당신의보기에 if 문을 피하고 컨트롤러 나 모델에서 문장을 처리하는 것이 좋은 습관이라고 생각합니다. – Odnxe

+0

감사합니다. Odnxe! if 진술 제안에 +1. 내 모델에서 if 문을 구현하고 더 나은지 확인합니다. :) – CyberJunkie

0

이 하나

$this->db->join('user_links', "user_links.user_id = users.user_id"); 

: user_links에 데이터가없는 경우

$this->db->join('user_links', "user_links.user_id = users.user_id", 'left outer'); 

는 CodeIgniter의에서 가입

기본적으로하지만 경우에 따라 INNER JOIN 사용을 그것은 아무 것도 반환하지 않습니다 그래서 위에 언급 한 것처럼 프레임 워크 CI에서 LEFT JOIN을 사용할 수 있습니다.