Laravel поисковый запрос с несколькими условиями

Новичок в PHP /Laravel, пожалуйста, будьте терпеливы.

У меня есть веб-страница, которая выполняет поиск по 3 критериям для собак, породы, пола и радиуса.

вот соответствующий код:

страница поиска

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

Когда я вхожу в поиски пуделя, самец, в пределах 20 миль, URL-адрес выглядит следующим образом:

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

Поиск в настоящее время работает нормально при поиске только породы.

Кажется, я не могу понять синтаксис для добавления критериев SEX и RADIUS. он должен допускать, чтобы эти критерии были нулевыми и по-прежнему выполнять запрос.

любой совет будет высоко ценится

12 голосов | спросил rommel109g 20 J000000Sunday14 2014, 20:47:00

3 ответа


0

Вы можете использовать области запросов http://laravel.com/docs/eloquent#query-scopes , чтобы сделайте его более подробным и простым в вашем контроллере (или там, где вы будете это делать в будущем), а затем объедините их в цепочку в соответствии с вашими потребностями:

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

Тогда все, что вам нужно, это:

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

  // ...
ответил Jarek Tkaczyk 20 J000000Sunday14 2014, 22:38:33
0

Вот одно из возможных решений, я думаю, что есть и другие. Создайте пустой построитель запросов с помощью функции query() и добавьте в него ненулевые предложения, затем вызовите paginate() в конце.

$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);
ответил Dave Morrissey 20 J000000Sunday14 2014, 21:06:11
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();
ответил M.J 10 ThuEurope/Moscow2015-12-10T14:16:39+03:00Europe/Moscow12bEurope/MoscowThu, 10 Dec 2015 14:16:39 +0300 2015, 14:16:39

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132