2017-02-09 1 views
1

일련의 방문 페이지를 검색하여 결과를 반환해야합니다. 내가 뭔가를 검색하는 경우, 그것이 내가 검색 한 내용을 반환하고, 나는 상태를 기준으로 필터링 할 경우 상태 괜찮 것을 반환문자열 및 상태를 사용하여 웅변으로 검색하기

/** 
* @var \Illuminate\Database\Eloquent\Builder 
*/ 
private $query; 

/** 
* @param string $status 
* @param string $search 
* @param int $offset 
* @return \Illuminate\Database\Eloquent\Collection 
*/ 
public function getLandingPageListing($status = 'all', $search = '', $offset = 0) 
{ 
    $this->query = $this->model->newQuery(); 
    $this->setRelationship(); 
    $this->setStatus($status); 
    $this->setSearch($search); 
    return $this->getLandingPages(); 
} 

private function setRelationship() 
{ 
    $this->query->with('message'); 
} 

/** 
* @param string $status 
*/ 
private function setStatus($status) 
{ 
    if ($status !== 'all') { 
     $this->query->where('lp_status', $status); 
    } 
} 

/** 
* @param string $search 
*/ 
private function setSearch($search) 
{ 
    if ($search !== '') { 
     $this->query->where('lp_title', 'LIKE', '%' . $search . '%'); 
     $this->query->orWhere('lp_description', 'LIKE', '%' . $search . '%'); 
     $this->query->orWhere('lp_domain', 'LIKE', '%' . $search . '%'); 
     $this->query->orWhereHas('message', function ($query) use ($search) { 
      $query->where('message_subject', 'LIKE', '%' . $search . '%'); 
     }); 
    } 
} 

/** 
* @return \Illuminate\Database\Eloquent\Collection 
*/ 
private function getLandingPages() 
{ 
    return $this->query->get(); 
} 

: 현재이 코드가 있습니다. 그러나 필터링하고 검색 할 때 작동하지 않고 마지막 동작 만 반환합니다.

내가 활성 상태로 필터링한다고 가정하면 모든 활성 방문 페이지가 반환됩니다. 그런 다음 해당 활성 페이지에서 '예제'를 검색하면 활성 상태 인 '예제'만 반환됩니다.

어떻게 해결할 수 있습니까?

답변

1

괄호가 필요합니다. 귀하의 orWhere 메소드는 귀하의 논리를 깨고 결과로 예제가 포함 된 모든 페이지를 반환합니다. 당신은이 코드 블록과 같은 것으로 그것을 할 수 있습니다.

private function setSearch($search) 
{ 
    if ($search !== '') { 
     $this->query(function($query) use ($search){ 
      $query->where('lp_title', 'LIKE', '%' . $search . '%'); 
      $query->orWhere('lp_description', 'LIKE', '%' . $search . '%'); 
      $query->orWhere('lp_domain', 'LIKE', '%' . $search . '%'); 
      $query->orWhereHas('message', function ($query) use ($search) { 
       $query->where('message_subject', 'LIKE', '%' . $search . '%'); 
      }); 
     }); 
    } 
} 

자세한 내용은 here을 참조하십시오.

+0

이것은 작동합니다. 그러나 필터를 변경하면 실제 검색이 기억 나지 않지만 조금만 더 살펴볼 것입니다. 도움을 주셔서 감사합니다. :) – Albert

관련 문제