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

 Смежные вопросы

  • Нет связанных вопросов^_^