2014-07-20 18 views
11

Người mới sử dụng PHP/Laravel ở đây vì vậy hãy kiên nhẫn.Truy vấn tìm kiếm Laravel với nhiều điều kiện

Tôi có trang web đang tìm kiếm dựa trên 3 tiêu chí cho chó, giống, giới tính và bán kính.

đây là mã có liên quan:

trang tìm kiếm

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

khi tôi nhập một tìm kiếm cho chó xù, nam, trong phạm vi 20 dặm, url cho thấy như sau:

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

Việc tìm kiếm hiện đang hoạt động ok khi tìm kiếm chỉ sinh sản.

Tôi không thể tìm ra cú pháp để thêm tiêu chí SEX và RADIUS. nên cho phép các tiêu chí đó là rỗng và vẫn thực hiện truy vấn.

bất kỳ lời khuyên nào sẽ được đánh giá rất cao

Trả lời

14

Bạn có thể sử dụng truy vấn phạm vi http://laravel.com/docs/eloquent#query-scopes để làm cho nó tiết và dễ dàng hơn trong điều khiển của bạn (hoặc bất cứ nơi nào bạn sẽ được làm việc đó trong tương lai) thì chuỗi chúng theo yêu cầu của bạn:

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

Sau đó tất cả bạn cần là thế này:

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

điều này có vẻ thực sự tốt nhưng có vẻ như tôi đã thiết lập cho ba giống tìm kiếm riêng biệt, hoặc giới tính hoặc bán kính chính xác? những gì tôi đã thực sự hy vọng để làm là có một tìm kiếm cho giống (mà đã hoạt động như là) và sau đó thêm vào các tùy chọn của tình dục và/hoặc bán kính. Tôi thích mã của bạn, ti dễ hiểu của nó hiểu đôi mắt mới của tôi nhưng bạn có thể cấu trúc lại nó để nó làm điều đó? – rommel109g

+0

Bạn hiểu sai. Những gì nó làm là 1 chuẩn bị truy vấn, 2 thêm mỗi bộ lọc đó là cần thiết, 3 có được kết quả từ truy vấn được xây dựng. Kết quả là bạn sẽ nhận được những chú chó phù hợp với tất cả các ràng buộc đã cho, nhờ các câu lệnh 'if'. –

2

Đây là một giải pháp khả thi, tôi nghĩ có thể có những giải pháp khác. Tạo một trình tạo truy vấn trống với hàm query() và thêm các mệnh đề không rỗng vào nó, sau đó gọi hàm paginate() ở cuối.

$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

'tìm kiếm' được sử dụng để tìm kiếm cho chó theo tên. – rommel109g

+0

Không chắc chắn ý của bạn là gì, đó là những gì mã này sẽ làm. –

+0

xin lỗi tôi đã bỏ đi và trang web sẽ không cho phép tôi hoàn thành nhận xét của mình. 'tìm kiếm' được sử dụng để tìm kiếm chó theo tên. người tôi đã thực sự cố gắng để làm việc trên 'tìm kiếm giống'. nếu tôi lấy mã của bạn và chỉ cần chuyển tên thành 'tìm kiếm giống' và chèn nó vào phần elseif, điều đó có hiệu quả không? – 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(); 
Các vấn đề liên quan