我对我的小型汽车项目进行了自定义搜索,现在有两个问题。让我先显示我的代码:这是我的SearchController
:
<?php
namespace App\Http\Controllers;
use App\Car;
use DB;
use Illuminate\Http\Request;
class SearchController extends Controller
{
// ovo je search controller
public function index(){
$cars = Car::all();
return view('searchcreate')->with('cars', $cars);
}
public function blogs(Request $request){
$from = $request->input('from');
$to = $request->input('to');
$search = $request->input('fuel');
$cars = DB::table('cars')
->where('brand', '=', $request->input('brand'))
->where('model', '=', $request->input('model'))
->where('fuel', '=', $request->input('fuel'))
->where('gear', '=', $request->input('gear'))
->whereBetween('price', [$from, $to])
->get();
return view('search')->with('cars', $cars);
}
}
这是我的search page
:
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">Search</div>
<div class="card-body">
{!! Form::open(['action' => 'SearchController@blogs', 'method' => 'GET']) !!}
<div class="column">
<label for="name">Brand:</label></br>
<select class="form-control" name="brand" id="input" onchange="random_function()">
<option value="" selected>Select your option</option>
<option value="Volkswagen">Volkswagen</option>
<option value="BMW">BMW</option>
<option value="Audi">Audi</option>
</select>
</div>
<br>
<div class="column">
<label for="model">Model:</label></br>
<select class="form-control" id="output" name="model">
</select>
</div>
<br>
<div class="column">
<label for="fuel">Fuel:</label></br>
<select class="form-control" name="fuel">
<option value="" disabled selected>Select your option</option>
<option value="diesel">Diesel</option>
<option value="gasoline">Gasoline</option>
</select>
</div>
<br>
<div class="column">
<label for="gear">Gear:</label></br>
<input name="gear[]" type="checkbox" placeholder="" value="ABS">ABS
<input name="gear[]" type="checkbox" placeholder="" value="CL">Child lock
<input name="gear[]" type="checkbox" placeholder="" value="navigation">Navigation
<input name="gear[]" type="checkbox" placeholder="" value="isofix">Isofix
</div>
<br>
<div class="column">
<label for="from">Price from:</label></br>
<input name="from" type="text" placeholder="" class="form-control" value="0">
</div>
<br>
<div class="column">
<label for="to">Price to:</label></br>
<input name="to" type="text" placeholder="" class="form-control" value="150000">
</div>
<br>
<button type="submit" class="btn btn-primary">
Search
</button>
{!! Form::close() !!}
</div>
</div>
</div>
</div>
</div>
@endsection
所以我的两个问题是:
[第一个问题是我需要所有搜索输入,如果用户仅输入品牌或燃料,则需要向他显示所有具有该特定品牌或燃料的汽车。
第二个问题是我的gear input
,这是用户在创建汽车发布时选择的数组。现在,如果用户想要在搜索用户时仅使用ABS来搜索某辆汽车,则需要准确检查该汽车后备箱的档位。我需要搜索以查找仅具有检查过的档位的任何汽车张贴,因此无需检查确切的档位。这两个问题的解决方案是什么?
您应该将查询分为各个搜索部分,因为您需要3种不同的where子句类型-标准where
,whereIn
(用于齿轮阵列)和whereBetween
(如果价格为设置)
这应该起作用:
$carQuery = DB::table('cars');
// standard where fields
foreach ($request->only(['brand', 'model', 'fuel']) as $term => $value) {
if (empty($value)) {
continue;
}
$carQuery->where($term, $value);
}
// gear is one of gears array values
if ($gears = $request->get('gear')) {
$carQuery->whereIn('gear', $gears);
}
// between a price from/to the values set
if (
$from = $request->input('from')
&& $to = $request->input('to')
) {
$carQuery->whereBetween('price', [$from, $to]);
}
$cars = $carQuery->get();