【问题标题】:Append filters to sql results on a collection in laravel将过滤器附加到 laravel 中集合的 sql 结果
【发布时间】:2020-01-06 07:02:42
【问题描述】:

因此,使用纯 PHP 和 MySQL,例如,我可以摆脱过滤查询。 $sql = 从用户中选择*;然后我有下拉菜单,国家省和地区。

如果用户未选择任何内容,请单击获取报告显示所有用户。如果用户从下拉菜单中选择任何内容,例如。国家 然后应根据所选国家缩小结果范围。用户也可以在所有下拉菜单上实现相同的功能。

所以我正在尝试使用 Laravel 归档相同的内容,我将向您展示我的代码。

我已经选择并加入了表格,并恢复了我的结果。如果设置了 dropdwon 值,我试图在结果中添加一个位置,但它并没有像我期望的那样给我结果

$results = DB::table('people')
            ->leftJoin('contacts', 'people.id', '=', 'contacts.person_id')
            ->leftJoin('provinces', 'contacts.province_id', '=', 'provinces.id')
            ->leftJoin('nationalities', 'people.nationality_id', '=', 'nationalities.id')
            ->leftJoin('districts', 'contacts.district_id', '=', 'districts.id')
            ->select('people.*', 'contacts.*', 'provinces.name AS province_name',
                'nationalities.name AS nationality', 'districts.name AS district_name');

        if (request()->has('nationality_id')) {
            $nationality_id = request('nationality_id');
            $results->where('people.nationality', '=', $nationality_id)->get();
        }

        return view('reports.index', compact('results', 'nationalities', 'provinces'));

我希望如果我选择下拉列表并喜欢省份,它会过滤集合,并选择所选省份的值。

【问题讨论】:

    标签: php sql laravel


    【解决方案1】:

    试试这个也许对你有帮助

    if (request()->has('nationality_id')) {
       $nationality_id = request('nationality_id');
       $results = DB::table('people')
            ->leftJoin('contacts', 'people.id', '=', 'contacts.person_id')
            ->leftJoin('provinces', 'contacts.province_id', '=', 'provinces.id')
            ->leftJoin('nationalities', 'people.nationality_id', '=', 'nationalities.id')
            ->leftJoin('districts', 'contacts.district_id', '=', 'districts.id')
            ->select('people.*', 'contacts.*', 'provinces.name AS province_name',
                'nationalities.name AS nationality', 'districts.name AS district_name')
            ->where('people.nationality', '=', $nationality_id)->get();
    }else{
      $results = DB::table('people')
            ->leftJoin('contacts', 'people.id', '=', 'contacts.person_id')
            ->leftJoin('provinces', 'contacts.province_id', '=', 'provinces.id')
            ->leftJoin('nationalities', 'people.nationality_id', '=', 'nationalities.id')
            ->leftJoin('districts', 'contacts.district_id', '=', 'districts.id')
            ->select('people.*', 'contacts.*', 'provinces.name AS province_name',
                'nationalities.name AS nationality', 'districts.name AS district_name')
            ->get();
    }
    

    【讨论】:

      【解决方案2】:

      你应该重写$results变量:

      //...
      if (request()->has('nationality_id')) {
          $nationality_id = request('nationality_id');
          $results = $results->where('people.nationality', '=', $nationality_id)->get();
      }
      //...
      

      【讨论】:

      • 我希望有三个下拉菜单,其中一个可以单独选择国籍,也可以同时选择国籍和省份,或者只选择省份但仍然过滤结果
      • 您应该根据用户输入构建您的请求。每次从下拉列表中检测到某些值时,添加新的 where 条件。如果一切都对国籍正确,只需为另一个下拉菜单添加另一个条件,但不要忘记重写$results
      【解决方案3】:

      这行有问题

      $results->where('people.nationality', '=', $nationality_id)->get();
      

      ->get() 方法返回新的Collection 对象,您需要将其传递给另一个变量。

      $results itslef 是一个Builderinstance。

      改变一下

       $results->where('people.nationality', '=', $nationality_id)->get();
      

       $results = $results->where('people.nationality', '=', $nationality_id)->get();
      

      你会得到你想要的。

      【讨论】:

        【解决方案4】:

        你应该编辑这段代码:

         if (request()->has('nationality_id')) {
                    $nationality_id = request('nationality_id');
                    $results =   $results->where('people.nationality', '=', $nationality_id)->get();
                }
        

        变成这样:

        if ($nationality_id = request('nationality_id')) {
                $results = $results->where('people.nationality', '=', $nationality_id);
            }
        
        $results = $results->get()
        

        【讨论】:

          猜你喜欢
          • 2019-10-01
          • 2017-07-18
          • 2013-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-28
          • 1970-01-01
          • 2017-08-03
          相关资源
          最近更新 更多