2014-07-20 6 views
11

Débutant à PHP/Laravel ici, alors s'il vous plaît soyez patient.Laravel requête de recherche avec plusieurs conditions

J'ai une page Web qui recherche en fonction de 3 critères pour les chiens, la race, le sexe et le rayon.

est ici le code correspondant:

recherche Page

<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() 

quand je recherche pour entrer dans une caniche, mâle, dans les 20 miles, l'url montre comme suit:

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

La recherche fonctionne actuellement bien lorsque vous recherchez simplement la race.

Je n'arrive pas à comprendre la syntaxe pour ajouter les critères SEX et RADIUS également. il devrait permettre à ces critères d'être nul et toujours effectuer la requête.

des conseils serait grandement apprecaited

Répondre

14

Vous pouvez utiliser requête-vues http://laravel.com/docs/eloquent#query-scopes pour le rendre bavard et plus facile dans votre contrôleur (ou partout où vous allez faire à l'avenir) puis la chaîne selon vos besoins:

// 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 
} 

Puis tout vous avez besoin est ceci:

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

cela semble vraiment bon, mais il me semble que vous l'avez mis en place pour trois recherches distinctes race, ou le sexe ou le rayon correct? Ce que j'espérais vraiment, c'était d'avoir une recherche de race (qui fonctionne déjà telle quelle) et d'ajouter ensuite les options de sexe et/ou rayon. J'aime ton code, il est facile de le comprendre à mes yeux novices mais peux-tu le refactoriser pour qu'il le fasse? – rommel109g

+0

Vous vous trompez. Ce qu'il fait est 1 préparer la requête, 2 ajouter chaque filtre qui est nécessaire, 3 obtenir le résultat de la requête construite. En conséquence, vous obtiendrez des chiens correspondant à toutes les contraintes données, grâce aux instructions 'if'. –

2

est ici une solution possible, je pense qu'il ya probablement d'autres. Créez un générateur de requête vide avec la fonction query() et ajoutez-y les clauses non nulles, puis appelez la fonction paginate() à la fin.

$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

la « recherche » est utilisé pour la recherche de chien par son nom. – rommel109g

+0

Vous ne savez pas ce que vous voulez dire, c'est ce que ce code va faire. –

+0

désolé je me suis éloigné et le site ne me laisserait pas finir mes commentaires. la 'recherche' est utilisée pour rechercher un chien par son nom. celui que j'essayais vraiment de travailler sur 'search-breed'. Si je prends votre code et que vous changez simplement le nom en 'search-breed' et que vous l'insérez dans la section elseif, cela devrait-il fonctionner? – 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(); 
Questions connexes