Laravel 5.2 Фильтрация AJAX по нескольким параметрам

#laravel #laravel-5.2

#laravel #laravel-5

Вопрос:

Я пытаюсь создать AJAX-фильтр для своего каталога автомобилей, сделать логику: «Если у меня есть SALES_NAME в запросе, я отфильтрую его (добавлю в фильтр из БД)», но я не понимаю, как это сделать.

У меня есть параметры — Производитель, Модель, Владелец. Я хочу фильтровать автомобили по любому из них. Если я выберу только один, например, owner — будут возвращены все автомобили владельца, если я выберу Toyota — все toyotas или, например, все Toyotas с именами владельцев Bob. Вот часть моего мнения:

 {!! Form::open(['id'=>'filter']) !!}
{{csrf_field()}}
<div class="form-group col-sm-2">
    {!! Form::select('sales_id', ['' => 'Owner']   $sales, null, ['class'=>'form-control', 'id'=>'sales_id']) !!}
</div>
<div class="form-group col-sm-2">
    {!! Form::select('manufacturer_id', ['' => 'Manufacturer']   $manufacturers, null, ['class'=>'form-control', 'id'=>'manufacturer_id']) !!}
</div>
<div class="form-group col-sm-1">
    <button type="button" class="btn btn-start" data-toggle="modal" data-target="#addmanufacturer  ">
        <i class="fa fa-plus" aria-hidden="true"></i>
    </button>
</div>
<div class="form-group col-sm-2">
    {!! Form::select('model_id', ['' => 'Model'], null, ['class'=>'form-control', 'id'=>'model_id']) !!}
</div>
<div class="form-group col-sm-1">
    <button type="button" class="btn btn-start" data-toggle="modal" data-target="#addmodel">
        <i class="fa fa-plus" aria-hidden="true"></i>
    </button>
</div>
<button type="submit" class="btn"><i class="fa fa-search" aria-hidden="true"></i></button>
{!! Form::close() !!}
  

JS:

  $('#manufacturer_id').on('change', function(e){
        var man_id = e.target.value;
        $.get('/admin/getmodels/models?man_id='   man_id, function(data){
            $('#model_id').empty();
            $.each(data, function(index, model){
                $('#model_id').append('<option value="'   model.id '">'
                          model.name   ' '   model.year   '</option>');
            });
        });
    });

    $('#filter').submit(function(event) {
        event.preventDefault();
        $('#cars').empty();
        $.post('/admin/getmodels/carfilter', $('#filter').serialize(), function (cars) {
                $.each(cars, function (index, car) {
                    $.post('/admin/getmodels/car', {car_id: car.id}, function (car) {
                        $('#cars').append('<div class="col-sm-2" id="car' car.id '"></div>');
                        if (car.photos.length > 0) {
                            $.each(car.photos, function (index, photo) {
                                if (index == 0) {
                                    $('#car'   car.id).append('<img class="img img-responsive" src="'   photo.file   '">').append('<div class="header header4 text-center">' car.manufacturer.name ' ' car.model.name ' ' car.model.year '</div>');
                                }
                            });
                        } else {
                            $.each(car.modelphoto, function (index, photo) {
                                if (index == 0) {
                                    $('#car'   car.id).append('<img class="img img-responsive" src="'   photo.file   '">').append('<div class="header header4 text-center">' car.manufacturer.name ' ' car.model.name ' ' car.model.year '</div>');
                                }
                            });
                        }
                    });
                });
            });
        });
  

Контроллер, я уверен, что это неправильно, но похоже, что я хочу сделать:

  public function postCarfilter(Request $request)
{
    $cars = Car::where('manufacturer_id', $request->manufacturer_id)->where('model_id',$request->model_id)->get();
    if ($request->sales_id != ""){
        $cars = $cars->where('user_id', $request->sales_id)->get();
    }
    return Response::json($cars);
}
  

Модели:

 class Car extends Model
{
public function user (){
    return $this->belongsTo('AppUser');
}

public function manufacturer (){
    return $this->belongsTo('AppManufacturer');
}

public function model(){
    return $this->belongsTo('AppCarModel');
}

public function photos(){
    return $this->morphMany('AppPhoto', 'imageable');
}

}

class User extends Authenticatable
{
public function car() {
    return $this->hasMany('AppCar');
}
}

class Manufacturer extends Model
{

public function car() {
    return $this->hasMany('AppCar');
}

public function model() {
    return $this->hasMany('AppCarModel');
}
}

class CarModel extends Model
{

public function car() {
    return $this->hasMany('AppCar');
}

public function manufacturer(){
    return $this->belongsTo('AppManufacturer');
}
}
  

Ответ №1:

Хорошо, я понял, я должен использовать конструктор запросов, поэтому новый контроллер:

 public function postCarfilter(Request $request)
{

    $cars = DB::table('cars');
    if ($request->sales_id != ""){
        $cars->where('user_id', $request->sales_id);
    }

    if ($request->manufacturer_id != ""){
        $cars->where('manufacturer_id', $request->manufacturer_id);
    }

    if ($request->model_id != ""){
        $cars->where('model_id', $request->model_id);
    }

    return Response::json($cars->get());
}
  

Может быть, это будет кому-то полезно