2014-09-02 3 views
2

여러 가지 옵션으로 검색 양식을 작성 중입니다. 아이디어는 경력, 지난 회사 일자리의 이름, 경험 연수 등과 같은 특정 특징을 가진 사람들을 찾는 것입니다.Codeigniter 활성 레코드로 'like'를 그룹화하는 방법은 무엇입니까?

양식의 첫 번째 부분에 후보자가 될 직업을 입력 할 수 있습니다 당신은 하나 이상의 회사 이름을 입력 할 수 있습니다. 내가 원하는 것은 이런 걸 보는 내 쿼리입니다 :

SELECT * 
FROM work_experience 
WHERE position = 'some position' 
AND (company LIKE 'company 1' OR company LIKE 'company 2', etc) 

문제는 내가 사용자가 입력 할 수 있습니다 호이 많은 회사 이름을 모르는입니다, 제가하는 일은 가게는 내가하지 않는 배열의 모든 이름 얼마나 큰지 알 수 있습니다.

or_like() 활성 레코드를 사용해 보았지만 문제점은 'positionx'또는 'company x'에서 일하는 사람들이 원하는 결과가 아 닌 사람들을 찾는 것이 었습니다.

활성 레코드를 사용하여이 쿼리를 만드는 방법이 있습니까? 또는 내가 찾고있는 회사 이름의 정확한 번호를 모르는 경우 어떻게 간단한 SQL에서 쿼리를 만들 수 있습니까?

시간과 도움을 주셔서 감사합니다. 명확하지 않은 것이 있으면 알려주세요.

+0

왜 사용하지 않는 where_in 당신이 확인하는 경우 추가 정보가 필요한지 알고 싶습니다. – Zeeshan

+0

더 자세한 정보가 필요합니까? (where_in은 어떻게 사용할 수 있습니까?) – Ant100

+0

@ Zeeshan은 설명서를 읽었을 때 좋은 소리를 내지 만 문제는 사용자가 저장되어있는 그대로 회사 이름을 정확하게 입력하지 못하는 것입니다. 예를 들어 'google' 회사와 사용자가 'Google'을 검색하면 '좋아요'를 사용하는 것입니다. – Ant100

답변

1

-


보기 :

<form action="/career/search/" method="POST"> 
     Position: <input type="text" name="position" /> 
     Company1: <input type="text" name="company[]" /> 
     Company2: <input type="text" name="company[]" /> 
     Company3: <input type="text" name="company[]" /> 
     ... 
     ... 
     CompanyN: <input type="text" name="company[]" /> 
</form> 


컨트롤러 :

class Career extends CI_Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function search() 
    { 
     $this->career_model->search_career($this->input->post()); 
    } 
} 


(A) 모델 (where_in 사용) :

class Career_model extends CI_Model 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function search_career($data) 
    { 
     $this->db->select('*'); 
     $this->db->where('position', $data['position']); 
     $this->db->where_in('company', $data['company']); 
     $query = $this->db->get('work_experience'); 

     echo "<pre>"; print_r($query->result()); // Result   
    } 
} 


(B) 모델 (사용 or_like) :

class Career_model extends CI_Model 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function search_career($data) 
    { 
     $this->db->select('*'); 
     $this->db->where('position', $data['position']); 

     foreach($data['company'] as $company) 
     { 
      $this->db->or_like('company', $company); 
     } 
     $query = $this->db->get('work_experience'); 

     echo "<pre>"; print_r($query->result()); // Result   
    } 
} 


편집 :

foreach($data['company'] as $company) 
{ 
    $wh[] = "`company` LIKE '".$company."'"; 
} 
$where = "(".implode("or", $wh).")"; 
$this->db->where($where, NULL, FALSE); 
+0

예 좋은 해결책입니다. 문제는 사용자가 데이터베이스에 저장된 것과 다른 회사 이름을 입력 할 수 있다는 것입니다. 예를 들어 사용자가 마지막으로 회사 이름을 'google inc'로 저장하고 사용자 유형 'Google'을 표시하지 않는 경우 그래서 내가 '좋아요'를 사용했습니다. – Ant100

+0

예, 친절하게 수정 사항을 확인하십시오. –

+0

네,이 작품은, 방금 해봤습니다. 이것이 작동 할 수있는 방법이 있습니까? 대신 (위치)를 (위치)처럼 사용할 수 있습니까? – Ant100

2

이 순서

컨트롤러 코드를 사용해보십시오

$getcompanyList=$this->input->post('company'); //post variable company from view 
$data['companyList']=explode(',', $getcompanyList); 
//Query for model 
$getResult=$this->myModel->somefunction($data); 

모델 코드 당신은 그럼 그냥 $ this-를 사용하여 마지막으로 쿼리를 인쇄 원하는 결과를 얻을 수없는 경우 이제

function somefunction($data){ 
$this->db->select('*'); 
$this->db->where('position','some position'); 
$this->db->where_in('company',$data['companyList']); 
//or $this->db->or_where_in('company',$data['companyList']); 
$getResult=$this->db->get('work_experience'); 
} 

> db-> last_query() 또는 응용 프로그램의 프로파일 링을 수행하고 생성되는 SQL을 확인하십시오. 이것은 어떻게해야입니다

+0

or_like를 어떻게 루프 할 수 있습니까? 나는 얼마나 많은 회사가 있을지 정확히 알지 못합니다. – Ant100

+0

사용자는 그가 찾고있는 회사의 양식을 쉼표로 구분하여 입력합니다. 그런 다음 각 회사를 배열에 저장합니다. 그런 다음 데이터베이스에서 사용자가 입력 한 회사를 찾습니다. – Ant100

+1

좋아 .. 텍스트 상자에 회사 목록을 가져 가고 (쉼표 [,]와 같은 일부 seprater를 통해 sepered하는 것이 바람직하다) 다음 $ this-> input-> post ('company')로 가져 와서 그것을 배열 및 모델에서 사용 where_in 절 ($ this-> db-> where_in ('company', $ companyArray)) – k10gaurav

관련 문제