【问题标题】:How to filter data from database using two input box in Laravel如何使用 Laravel 中的两个输入框过滤数据库中的数据
【发布时间】:2020-10-12 08:10:14
【问题描述】:

我刚刚关注了一个 YouTube 教程,导师做了一些与我想要的类似的事情 教程链接:Laravel 5.8 - Custom Search in Datatables using Ajax

在教程中,导师使用 Datatable 加载所有数据并显示所有过滤结果。

我需要有自己的自定义设计,我可以在其中添加@foreach 并自定义设计, 我不知道我该怎么做我尝试了很多方法,但我失败了。

有人可以建议我一个解决方案,或者建议我遵循任何教程,以便我可以根据需要将过滤后的数据加载到我的视图中。

这是我的stores.blade.php,搜索字段和表格在哪里,

     <h3 align="center">Store Locator</h3>
        <div class="row">
            <div class="col-md-4"></div>
            <div class="col-md-4">
                <div class="form-group">
                    <select name="filter_district" id="filter_district" class="form-control" required>
                        <option value="">Select Distric</option>
                        @foreach ($district_name as $district)
                             <option value="{{ $district->district }}">{{ $district->district }}</option>
                        @endforeach
                    </select>
                </div>
                <div class="form-group">
                    <select name="filter_outlet" id="filter_outlet" class="form-control" required>
                       <option value="">Select Outlet</option>
                        @foreach($outlet_name as $country)
                            <option value="{{ $country->outlet }}">{{ $country->outlet }}</option>
                        @endforeach
                    </select>
                </div>
                
                <div class="form-group" align="center">
                    <button type="button" name="filter" id="filter" class="btn form-submit">Filter</button>

                    <button type="button" name="reset" id="reset" class="btn form-submit">Reset</button>
                </div>
            </div>
            <div class="col-md-4"></div>
        </div>
        <br />
        <div class="table-responsive">
            <table id="store_data" class="table table-bordered table-striped">
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>Outlet</th>
                        <th>Province</th>
                        <th>District</th>
                        <th>Number 1</th>
                        <th>Number 2</th>
                        <th>Number 3</th>
                        <th>Address</th>
                    </tr>
                </thead>
            </table>
        </div>

这是stores.blade.php中的脚本

    <script>
$(document).ready(function(){
    fill_datatable();
    function fill_datatable(filter_district = '', filter_outlet = '')
    {
        var dataTable = $('#store_data').DataTable({
            processing: true,
            serverSide: true,
            ajax:{
                url: "{{ route('store-locatorr.index') }}",
                data:{filter_district:filter_district, filter_outlet:filter_outlet}
            },
            columns: [
                {
                    data:'id',
                    name:'id'
                },
                {
                    data:'outlet',
                    name:'outlet'
                },
                {
                    data:'province',
                    name:'province'
                },
                {
                    data:'district',
                    name:'district'
                },
                {
                    data:'no1',
                    "render": function(data, type, row, meta) {
                        if (type === 'display') {
                        data = '<a class="gray" href="tel:' + data + '">' + data + '</a>';
                        }
                        return data;
                    },
                    name:'no1'
                },
                {
                    data:'no2',
                    "render": function(data, type, row, meta) {
                        if (type === 'display') {
                        data = '<a class="gray" href="tel:' + data + '">' + data + '</a>';
                        }
                        return data;
                    },
                    name:'no2'
                },
                {
                    data:'no3',
                    "render": function(data, type, row, meta) {
                        if (type === 'display') {
                        data = '<a class="gray" href="tel:' + data + '">' + data + '</a>';
                        }
                        return data;
                    },
                    name:'no3'
                },
                {
                    data:'address',
                    name:'address'
                }
            ]
        });
    }

    // $('#filter_outlet').on('change',function(){
    $('#filter').click(function(){
        var filter_district = $('#filter_district').val();
        var filter_outlet = $('#filter_outlet').val();

        if(filter_district != '' &&  filter_district != '')
        {
            $('#store_data').DataTable().destroy();
            fill_datatable(filter_district, filter_outlet);
        }
        else
        {
            alert('Select Both filter option');
        }
    });

    $('#reset').click(function(){
        $('#filter_district').val('');
        $('#filter_outlet').val('');
        $('#store_data').DataTable().destroy();
        fill_datatable();
    });

});
</script>

这是我的模型

    <?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Store extends Model
{
    protected $table = 'stores';
}

这是我的 StoreLocatorController.php

    <?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Store;


class StoreLocatorController extends Controller
{
      function index(Request $request)
    {
     if(request()->ajax())
     {
      if(!empty($request->filter_district))
      {
       $data = Store::select('id','outlet', 'province', 'district', 'no1', 'no2', 'no3', 'address')
         ->where('district', $request->filter_district)
         ->where('outlet', $request->filter_outlet)
         ->get();
      }
      else
      {
       $data = Store::select('id','outlet', 'province', 'district', 'no1', 'no2', 'no3', 'address')
        ->get();
      }
      return datatables()->of($data)->make(true);
     }
     $outlet_name = Store::select('outlet')
          ->groupBy('outlet')
          ->orderBy('outlet', 'ASC')
          ->get();

    $district_name = Store::select('district')
        ->groupBy('district')
          ->orderBy('district', 'ASC')
          ->get();
     return view('test.stores', compact('outlet_name','district_name'));


      // $count = Store::orderBy('id')->where('district','Kandy')->count();
        // $store = Store::orderBy('id','asc')->get();
        // return view("test.stores")->with('store',$store)->with('count',$count);
        // return view("test.stores");
    }

    
}

这是我的网络路线

Route::resource('/store-locatorr', 'StoreLocatorController');

这是我的database

这就是我的用户界面的样子

我只是想知道如何显示从数据库加载到表中以加载到 foreach 中的结果,以便我可以设计我想要的方式,同时搜索功能按原样工作, 有人可以帮助我吗,或者请给我一些可以解决此问题的建议,

【问题讨论】:

    标签: php ajax laravel laravel-5 eloquent


    【解决方案1】:

    当您通过预加载发送结果时,您需要包含商店的地区名称。所以在你的 store 模型中,创建一个 belongsTo 关系

    public function district() {
        return $this->belongsTo('App\District', 'district');
    }
    

    所以当你发送你的结果时,你可以写

    $data = Store::select('id','outlet', 'province', 'district', 'no1', 'no2', 'no3', 'address')
         ->where('district', $request->filter_district)
         ->where('outlet', $request->filter_outlet)
         ->with(['district'])
         ->get();
    

    【讨论】:

      猜你喜欢
      • 2022-09-22
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 2018-04-03
      • 2022-12-21
      • 2018-05-25
      • 2011-04-13
      相关资源
      最近更新 更多