doumianfeng6979
doumianfeng6979
2019-07-19 07:02
浏览 56
已采纳

在Laravel中显示搜索表单结果的问题

I building an application for ads/properties in Laravel. I have a search form with filters that are checkboxes. I am having a problem when I select two options from the same request for example supply, demand that are PropertyBidAsk I get only results from demand and not both, also I would like to keep both checked after form submission. Supply and demand are values in the category column in the categories table. Any help is appreciated. Here is my code.

CategoryController.php:

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

    $query = Property::query();

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

    if ($request->propertyBidAsK == 'supply' && $request->propertyBidAsk== 'demand') {
        $query->whereHas('category', function ($query) use ($request) {
            $query->where('category', 'like', '%' . $request->propertyBidAsk . '%');
        });
    } elseif ($request->propertyBidAsk == 'supply') {
        $query->whereHas('category', function ($query) use ($request) {
            $query->where('category', 'like', '%' . 'supply' . '%');
        });
    } else if ($request->propertyBidAsk == 'demand') {
        $query->whereHas('category', function ($query) use ($request) {
            $query->where('category', 'like', '%' . 'demand' . '%');
        });
    }

    $results = $query->paginate(6);

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

search.blade.php:

<div class="col-md-2 mb-6">
    <h5>Payment Method</h4>
    <div class="d-block my-3">
        <div class="custom-control custom-checkbox">
            <input id="supply" name="propertyBidAsk" value="supply" type="checkbox" class="custom-control-input" @if(old('propertyBidAsk', $request->propertyBidAsk ?? 'default') === 'supply') checked @endif>
            <label class="custom-control-label" for="supply">supply</label>
        </div>
        <div class="custom-control custom-checkbox">
            <input id="demand" name="propertyBidAsk" value="demand" type="checkbox" class="custom-control-input" @if(old('propertyBidAsk', $request->propertyBidAsk ?? 'default') === 'demand') checked @endif>
            <label class="custom-control-label" for="demand">demand</label>
        </div>
    </div>
</div>
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • douchui7332
    douchui7332 2019-07-19 07:15
    已采纳

    To get the multi select output with same name attr, update name of your checkbox input to propertyBidAsk[] as array. You will get input array.

    <input id="supply" name="propertyBidAsk[]" value="supply" type="checkbox" class="custom-control-input" @if(old('propertyBidAsk', $request->propertyBidAsk ?? 'default') === 'supply') checked @endif>
    
    
    <input id="demand" name="propertyBidAsk[]" value="demand" type="checkbox" class="custom-control-input" @if(old('propertyBidAsk', $request->propertyBidAsk ?? 'default') === 'demand') checked @endif>
    

    In controller will get the value by.

    public function search(Request $request, Property $property)
    {
        $category = $property->category;
    
        $query = Property::query();
    
        if ($request->has('propertyBidAsk')) {
            $request->get('propertyBidAsk');
        }
    
    
        $propertyBidAsk = $request->input('propertyBidAsk'); //$propertyBidAsk will get in array
    
        if (in_array('supply', $propertyBidAsk)  && in_array('demand', $propertyBidAsk)){
            $query->whereHas('category', function ($query) use ($request) {
                $query->where('category', 'like', '%demand%')->orWhere('category', 'like', '%supply%')
            });
        } else if(in_array('supply', $propertyBidAsk)){
            $query->whereHas('category', function ($query) use ($request) {
                $query->where('category', 'like', '%' . 'supply' . '%');
            });
        } else  if(in_array('demand', $propertyBidAsk)){
            $query->whereHas('category', function ($query) use ($request) {
                $query->where('category', 'like', '%' . 'demand' . '%');
            });
        }
    
        $results = $query->paginate(6);
    
        return view('search', compact('category', 'results', 'request'));
    }
    
    点赞 评论
  • dongle7882
    dongle7882 2019-07-19 07:20

    As @Shivendra Singh answer you can do that and you can do this also

    <input id="supply" name="propertyBidAsk1" value="supply" type="checkbox" class="custom-control-input" @if(old('propertyBidAsk', $request->propertyBidAsk ?? 'default') === 'supply') checked @endif>
    
    
    <input id="demand" name="propertyBidAsk2" value="demand" type="checkbox" class="custom-control-input" @if(old('propertyBidAsk', $request->propertyBidAsk ?? 'default') === 'demand') checked @endif>
    

    You see you can't have same name in an form element it will always get the first value.

    then in you controller

    if (!empty($request->propertyBidAsK1) && !empty($request->propertyBidAsk2) {
            $query->whereHas('category', function ($query) use ($request) {
                $query->where('category', 'like', '%' . $request->propertyBidAsk1 . '%')
                      ->orWhere('category', 'like', '%' . $request->propertyBidAsk2 . '%');
            });
        } elseif (!empty($request->propertyBidAsk1)) {
            $query->whereHas('category', function ($query) use ($request) {
                $query->where('category', 'like', '%' . 'supply' . '%');
            });
        } else if (!empty($request->propertyBidAsk2)) {
            $query->whereHas('category', function ($query) use ($request) {
                $query->where('category', 'like', '%' . 'demand' . '%');
            });
        }
    

    Hope it helps

    点赞 评论

相关推荐