Laravel search query with multiple conditions

后端 未结 3 813
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-31 05:52

Newbie to PHP/Laravel here so please be patient.

I have a webpage that is searching based on 3 criteria for dogs , breed, sex and radius.

here is the relevant co

相关标签:
3条回答
  • 2021-01-31 06:04

    Here's one possible solution, I think there are probably others. Create an empty query builder with the query() function and add the non-null clauses to it, then call the paginate() function at the end.

    $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 讨论(0)
  • 2021-01-31 06:14

    You can use query scopes http://laravel.com/docs/eloquent#query-scopes to make it verbose and easier in your controller (or wherever you will be doing it in future) then chain them according to your needs:

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

    Then all you need is this:

    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 讨论(0)
  • 2021-01-31 06:27
    $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();
    
    0 讨论(0)
提交回复
热议问题