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

У меня есть форма поиска, чтобы перечислить свойства / объявления по определенным критериям. Моя форма поиска работает, но я не получаю желаемых результатов при поиске с несколькими фильтрами. У меня есть три типа фильтров. Заявка на покупку недвижимости (спрос, предложение), Оплата имущества (покупка, аренда), Тип недвижимости (дом, квартира, гараж). Например, когда я нажимаю, чтобы искать по запросу, купить, дом, он возвращает один результат, где есть спрос, покупка, дом, и еще два, где есть покупка и дом, но там третий параметр - предложение. Я стараюсь добиться того, чтобы фильтр удовлетворял всем трем условиям, а не только двум. Любая помощь приветствуется. Вот мой код.

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($propertyBidAsk, $propertyPayment, $propertyType, $city, $price, $quadrature, Request $request, Property $property)
    {
        $category = $property->category;

        if (!empty($request->propertyBidAsk)) {

           $property = Property::whereHas('category', function ($query) use ($request) {
           $query->where('category', 'like', '%' . $request->propertyBidAsk . '%');
           })->get();
        }

        if (!empty($request->propertyPayment)) {

            $property = Property::whereHas('category', function ($query) use ($request) {
            $query->where('category', 'like', '%' . $request->propertyPayment . '%');
           })->get();
        }

        if (!empty($request->propertyType)) {

            $property = Property::whereHas('category', function ($query) use ($request) {
            $query->where('category', 'like', '%' . $request->propertyType . '%');
            })->get();
        }

        $results = $property;

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

search.blade.php

@extends('layouts.app')

@section('content')

<div class="container">
<div class="py-5 text-center">
  <h2>Search</h2>
</div>

<div class="row justify-content-md-center">

  <div class="col-md-8 order-md-1">
    <div>

      @if(isset($results))
        <table class="table">
          <thead>
            <th>Property Bid Ask</th>
            <th>Property Payment</th>
            <th>Property Type</th>
          </thead>
          <tbody>
            @foreach ($results as $result)
              <tr>
                <td>{{ $result->category[0]->category }}</td>
                <td>{{ $result->category[1]->category }}</td>
                <td>{{ $result->category[2]->category }}</td>
              </tr>
            @endforeach
          </tbody>
        </table>
      @endif

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

      <div class="row">

      <hr class="mb-4">

      <div class="row">

        <div class="col-md-4 mb-6">
          <h5>Payment</h4>
          <div class="d-block my-3">
            <div class="custom-control custom-radio">
              <input id="offer" name="propertyBidAsk" value="offer" type="radio" class="custom-control-input">
              <label class="custom-control-label" for="offer">offer</label>
            </div>
            <div class="custom-control custom-radio">
              <input id="demand" name="propertyBidAsk" value="demand" type="radio" class="custom-control-input">
              <label class="custom-control-label" for="demand">demand</label>
            </div>
          </div>
        </div>

        <div class="col-md-3 mb-6">
        <h5>Property payment</h4>
          <div class="d-block my-3">
            <div class="custom-control custom-radio">
               <input id="buy" name="propertyPayment" value="buy" type="radio" class="custom-control-input">
              <label class="custom-control-label" for="buy">buy</label>
            </div>
            <div class="custom-control custom-radio">
              <input id="rent" name="propertyPayment" value="rent" type="radio" class="custom-control-input">
              <label class="custom-control-label" for="rent">rent</label>
            </div>
          </div>
        </div>

        <div class="col-md-5 mb-6">
          <h5>Property type</h4>
            <div class="d-block my-3 ">
              <div class="custom-control custom-radio">
                <input id="house" name="propertyType" value="house" type="radio" class="custom-control-input">
                <label class="custom-control-label" for="house">Kucahouse/label>
              </div>
              <div class="custom-control custom-radio">
                <input id="flat" name="propertyType" value="flat" type="radio" class="custom-control-input">
                <label class="custom-control-label" for="flat">flat</label>
              <div class="custom-control custom-radio">
                <input id="garage" name="propertyType" value="garage" type="radio" class="custom-control-input">
                <label class="custom-control-label" for="garage">garage</label>
              </div>
            </div>
        </div>

      </div>

    <hr class="mb-4">

    <button class="btn btn-primary btn-lg btn-block">Search</button>

  </form>

  <script>
    var onSubmitFunc = function(e){
      e.preventDefault();
      e.stopPropagation();
      if( e.stopImmediatePropagation ){
        e.stopImmediatePropagation();
      }

      var propertyBidAsk = this["propertyBidAsk"].value.trim() || 0;
      var propertyPayment = this["propertyPayment"].value.trim() || 0;
      var propertyType = this["propertyType"].value.trim() || 0;

      url = propertyBidAsk.length === 0 ? '' : ( '/' + encodeURIComponent(propertyBidAsk) );
      url += propertyPayment.length === 0 ? '' : ( '/' +  encodeURIComponent(propertyPayment) );
      url += propertyType.length === 0 ? '' : ( '/' + encodeURIComponent(propertyType) );

      window.location.href = this.action + url;

    }

    document.addEventListener( 'DOMContentLoaded', function(){
    var srch = document.getElementById("searchForm");
    srch.addEventListener('submit', onSubmitFunc, false);
    }, false );

  </script>

     </div>

  </div>

</div>

@endsection

Ответы [ 2 ]

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

Если вы хотите условно добавить несколько фильтров в запрос одновременно, вы можете запустить запрос сверху, затем добавить фильтры и, наконец, получить результат в конце:

$query = Property::query();
if (!empty($request->propertyBidAsk)) {
    $query->whereHas('category', function ($query) use ($request) {
        $query->where('category', 'like', '%' . $request->propertyBidAsk . '%');
    });
}
if (!empty($request->propertyPayment)) {
    $query->whereHas('category', function ($query) use ($request) {
        $query->where('category', 'like', '%' . $request->propertyPayment . '%');
    });
}
if (!empty($request->propertyType)) {
    $query->whereHas('category', function ($query) use ($request) {
        $query->where('category', 'like', '%' . $request->propertyType . '%');
    });
}
$property = $query->get();
1 голос
/ 03 июля 2019

Я думаю, что вы перезаписываете переменную $property в этом случае, если выполняется несколько условий, тогда даже если ваш первый запрос выполняется, он заменит все данные за секунду if condition Чтобы решить эту проблему, попробуйте сохранить все три запроса result of ->get() в массиве и вернуть этот массив данных. Сначала вы должны назначить пустой массив в верхней части, и всякий раз, когда условие становится истинным, сохранять эти данные в массиве соответственно.

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