2014-07-20 12 views
11

Newbie do PHP/Laravel tutaj, więc proszę o cierpliwość.Laravel zapytanie wyszukiwania z wieloma warunkami

Mam stronę, która wyszukuje w oparciu o 3 kryteria dla psów, rasy, płci i promienia.

tutaj jest odpowiedni kod:

strona wyszukiwania

<div class="col-md-12 zero-pad-left zero-pad-right"> 
{{ Form::open(array('action' => array('[email protected]'), 'class'=>'form width88', 'role'=>'search', 'method' => 'GET')) }} 
<div id="prefetch"> 
    {{ Form::text('search-breed', null, array('class' => 'typeahead form-group form-control', 'placeholder' => 'Search by breed here...')) }} 
    {{ Form::text('sex', null, array('class' => 'form-group form-control', 'placeholder' => 'Search by sex here...')) }} 
    {{ Form::text('miles', null, array('class' => 'form-group form-control', 'placeholder' => 'Search by distance here...')) }} 




</div> 
{{ Form::submit('Search', array('class' => 'btn btn-default search-bar-btn')) }} 
{{ Form::close() }} 

ControllerPage

class DogsController extends \BaseController { 

public function __construct() 
{ 
    // call base controller constructor 
    parent::__construct(); 

    // run auth filter before all methods on this controller except index and show 
    $this->beforeFilter('auth', array('except' => array('show'))); 
} 

/** 
* Display a listing of the resource. 
* 
* @return Response 
*/ 
public function index() 
{ 
    if (Input::has('search')) { 
     $queryString = Input::get('search'); 
     $dogs = Dog::where('name', 'LIKE', "%$queryString%")->orderBy('name')->paginate(5); 
    } 

    elseif (Input::has('search-breed')) 
    { 
     $dogs = Dog::whereHas('breed', function($q)  
     { 
      $queryString = Input::get('search-breed'); 
      $q->where('name', 'LIKE', "%$queryString%"); 

     })->orderBy('name')->paginate(5); 

    } //end elseif 

    else { 
     $dogs = Dog::orderBy('name')->paginate(5); 
     } //end else 

    return View::make('dogs.index')->with(array('dogs' => $dogs)); 
} //end function index() 

kiedy wchodzi poszukiwanie pudel, mężczyzna, w promieniu 20 mil adres URL przedstawia się następująco:

http://ruff-love.dev/dogs?search-breed=poodle&sex=M&miles=20 

Wyszukiwanie obecnie działa poprawnie podczas wyszukiwania tylko rasy.

Nie mogę znaleźć składni, aby dodać również kryteria SEX i RADIUS. powinno pozwolić, aby te kryteria były puste i nadal wykonywać zapytanie.

wszelkie porady byłyby znacznie apprecaited

Odpowiedz

14

Można użyć kwerendy celownicze http://laravel.com/docs/eloquent#query-scopes zrobić to rozwlekły i łatwiejsze w kontrolerze (lub gdziekolwiek będzie to robić w przyszłości), a następnie łańcucha je w zależności od potrzeb:

// Dog model 
public function scopeSearchBreed($query, $breed) 
{ 
    $query->whereHas('breed', function ($q) use ($breed) { 
    $q->where('name', 'like', "%{$breed}%"); 
    }); 
} 

public function scopeWithinRadius($query, $radius) 
{ 
    $query->where(...); // do math here 
} 

Wtedy wszystko trzeba to:

public function index() 
{ 
    $q = Dog::query(); 

    if (Input::has('search')) 
    { 
    // simple where here or another scope, whatever you like 
    $q->where('name','like',Input::get('search')); 
    } 

    if (Input::has('search-breed')) 
    { 
    $q->searchBreed(Input::get('search-breed')); 
    } 

    if (Input::has('sex')) 
    { 
    $q->where('sex', Input::get('sex')); 
    } 

    if (Input::has('radius')) 
    { 
    $q->withinRadius(Input::get('radius')); 
    } 

    $dogs = $q->orderBy(..)->paginate(5); 

    // ... 
+0

to wygląda naprawdę dobrze, ale wygląda na to, że skonfigurowałeś go dla trzech różnych wyszukiwań, płci lub promienia? to, co naprawdę chciałem zrobić, to poszukać rasy (która już działa tak, jak jest), a następnie dodać opcje seksu i/lub promienia. Podoba mi się twój kod, łatwe do zrozumienia dla moich nowicjuszy, ale czy możesz go zmienić, aby to zrobił? – rommel109g

+0

Źle. To, co robi, to 1 przygotować zapytanie, 2 dodać każdy filtr, który jest niezbędny, 3 uzyskać wynik z wbudowanego zapytania. W rezultacie otrzymasz psy pasujące do wszystkich danych ograniczeń, dzięki instrukcjom "if". –

2

Oto jeden z możliwych rozwiązanie, myślę, że prawdopodobnie istnieją inne. Utwórz pusty konstruktor zapytań za pomocą funkcji query() i dodaj do niej klauzule inne niż NULL, a następnie wywołaj funkcję paginate() na końcu.

$builder = Dogs::query(); 
if (Input::has('search')) { 
    $queryString = Input::get('search'); 
    $builder->where('name', 'LIKE', "%$queryString%"); 
} 
// ... more clauses from the querystring 
$dogs = $builder->orderBy('name')->paginate(5); 
+0

„szukaj” służy do poszukiwania psa po imieniu. – rommel109g

+0

Nie wiesz, co masz na myśli, to właśnie ten kod zrobi. –

+0

Przepraszam, odsunąłem się, a strona internetowa nie pozwoli mi dokończyć moich komentarzy. "szukaj" służy do wyszukiwania psa według nazwy. ten, który naprawdę próbowałem pracować nad "wyszukiwaniem rasy". jeśli wezmę twój kod i po prostu zmieniam nazwę na "search-breed" i wstawiam ją w sekcji elseif, czy to zadziała? – rommel109g

0
$builder = Dogs::query(); 
$term = Request::all(); 
if(!empty($term['breed'])){ 
    $builder->where('breed','=',$term['breed']); 
} 
if(!empty($term['sex'])){ 
    $builder->where('sex','=',$term['sex']); 
} 
if(!empty($term['radius'])){ 
    $builder->where('radius','=',$term['radius']); 
} 

$result = $builder->orderBy('id')->get(); 
Powiązane problemy