2017-02-09 50 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

This Works。但是,如果我更改過濾器,它不記得實際的搜索,但我會更多地玩弄它。感謝您的幫助。 :) – Albert