Проблема с определением минимальной и максимальной цены фильтра в форме поиска в Laravel - PullRequest
3 голосов
/ 03 июля 2019

У меня есть форма поиска, чтобы перечислить свойства / объявления по определенным критериям. В моей форме я пытаюсь искать и перечислять свойства из базы данных, которые соответствуют введенным min_price и max_price. Когда я отправляю форму, я не получаю результатов в таблице, а когда умираю и сбрасываю переменные min_price или max_price, я получаю false. Любая помощь приветствуется. Вот мой код

CategoryController.php

<?php
namespace App\Http\Controllers;

use App\Category;
use App\Property;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Redirect;

class CategoryController extends Controller
{
    public function index()
    {
        return view('categories.search', compact('data'));
    }

    public function search($price, Request $request, Property $property)
    {
        $category = $property->category;

        $query = Property::query();

        // Code for min and max price

        $min_price = $request->has('min_price');
        $max_price = $request->has('max_price');
        //dd($max_price);

        if (($min_price) && ($max_price)) {
            $query->whereBetween('price', [$min_price, $max_price]);
        }
        elseif (! is_null($min_price)) {
            $query->where('price', '>=', $min_price);
        }
        elseif (! is_null($max_price)) {
            $query->where('price', '<=', $max_price);
        }

        $results = $query->get();

        return view('categories.search', compact('category', 'results'));
    }
}

search.blade.php

@if(isset($results))
    <table class="table">
        <thead>
            <th>Price</th>
        </thead>
        <tbody>
            @foreach ($results as $result)
                <tr>
                    <td>{{ $result->price }}</td>
                </tr>
            @endforeach
        </tbody>
     </table>
@endif

<form id="searchForm" method="GET" action="/search">

    <div class="col-md-6 mb-6">
        <label>Price</label>
        <input type="number" id="min_price" name="min_price" class="form-control" placeholder="Min Price">
        <input type="number" id="max_price" name="max_price" class="form-control" placeholder="Max Price">
    </div>
    <button class="btn btn-primary btn-lg btn-block">Search</button>

</form>

Ответы [ 3 ]

2 голосов
/ 03 июля 2019

Основная проблема заключалась в том, что у вас не было данных в $request, но в вашей переменной $price у вас было что-то вроде этого: "min_price=1000-max_price=2000".

Так что вам нужно получить значения из этой строки:

public function search($price, Request $request, Property $property)
    {
        $category = $property->category;
        $array = explode('-', $price); // Array of your values
        foreach($array as $a){ 
            $s = []; 
            $s = explode('=', $a); 
            if ($s[0] === 'min_price'){ 
               $s[1] ? $min_price = intval($s[1]) : $min_price = null;
            } else { 
               $s[1] ? $max_price = intval($s[1]) : $max_price = null; 
            } 
        }
        if (!empty($min_price) && !empty($max_price)) {
            $results = Property::whereBetween('price', [$min_price, $max_price])->get();

            return view('categories.search', compact('category', 'results'));
        }
        elseif (!empty($min_price)) {
            $results = Property::where('price', '>=', $min_price)->get();
        }
        elseif (!empty($max_price)) {
            $results = Property::where('price', '<=', $max_price)->get();
        }

        return view('categories.search', compact('category', 'results'));
    }

Возможно, вам нужно попытаться отправить min_price и max_price в лучшем формате, но это должно сработать.

Удачи.

1 голос
/ 03 июля 2019

Вы можете использовать метод laravel elqouent when. Сделайте это.

Таким образом, ваш запрос должен выглядеть примерно так:

$query = Property::query();


$request->has('max_price') && $request->has('min_price')
? $query->whereBetween('price', [$request->get('min_price'), $request->get('max_price')])
: $query->when($request->has('min_price'), function ($query) use ($request) {
$query->where('price', '>=', $request->get('min_price'));
})->when($request->has('min_price'), function ($query) use ($request) {
$query->where('price', '<=', $request->get('max_price'));
});

$results = $query->get();

Посмотрите на это https://laraveldaily.com/less-know-way-conditional-queries/ для более подробной информации

Удачи

0 голосов
/ 03 июля 2019

$request->has - это функция laravel, просто для проверки, имеет ли ваш запрос определенное значение или нет, он всегда будет возвращать true или false. При получении значения запроса вы можете использовать $request->get('name'), поэтому ваша функция поиска должна быть:

public function search($price, Request $request, Property $property)
{
    $category = $property->category;

    $query = Property::query();

    // Code for min and max price
    $min_price= 0;
    $max_price= 0;
    if($request->has('min_price')){
        $min_price = $request->get('min_price');
    }

    if($request->has('max_price')){
        $max_price = $request->get('max_price');
    }

    //dd($max_price);

    if (($min_price) && ($max_price)) {
        $query->whereBetween('price', [$min_price, $max_price]);
    }
    elseif (! is_null($min_price)) {
        $query->where('price', '>=', $min_price);
    }
    elseif (! is_null($max_price)) {
        $query->where('price', '<=', $max_price);
    }

    $results = $query->get();

    return view('categories.search', compact('category', 'results'));
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...