如何加入从我的数组的每个元素的数据库中提取的结果并在 Laravel 8 中以 json 形式返回

Posted

技术标签:

【中文标题】如何加入从我的数组的每个元素的数据库中提取的结果并在 Laravel 8 中以 json 形式返回【英文标题】:How to join a result extracted from Database of each element of my array and return it in json in Laravel 8 【发布时间】:2021-11-05 06:59:53 【问题描述】:

我正在做一个 Laravel 8 项目,我在表单的多选栏中选择了一堆类别,我想在我的数据库中为我选择的每个类别返回供应商,以便我可以将它们显示在我的表单的下一个选择栏中,我为此使用 ajax,但我似乎不知道如何将每个类别的供应商组合成一个最终结果,所以我可以将其发送回我的 json 视图,可以有人告诉我我做错了什么以及如何解决这个问题?这是我的控制器

public function get_fournisseurs(Request $request)
    try 
      if($request->ajax()) 
            $query = $request->get('selectednumbers');

            if(empty($query)) 
                return back()->withError("Désolé, une erreur de serveur s'est produite (requête vide)");
             
            else 
                $fournisseurs[] = new FourCats();
                foreach ($query as $value) 
                    $fou[]=FourCats::join('fournisseurs','four_cat.four', '=', 'fournisseurs.id')
                        ->where('four_cat.cat','=', $value)
                        ->select('fournisseurs.id','fournisseurs.nomSociete','fournisseurs.id','fournisseurs.tel')
                        ->get();
                        foreach($fou as $f) 
                            $fournisseurs = implode(array($f));
                        
                    $fournisseurs = implode(array( $fournisseurs));
                
               return json_encode(array('data'=>$fournisseurs));

            
        

     catch (\Throwable $th) 
        throw $th;
    

这是我的ajax方法

    $('#first-choice').change(function()

        if( $('#first-choice :selected').length > 0)
            var selectednumbers = [];
            $('#first-choice :selected').each(function(i, selected) 
                selectednumbers[i] = $(selected).val();
            );
            console.log(selectednumbers);
            $.ajax(
                url: ' url('get_fournisseurs') ',
                method:'GET',
                data: selectednumbers: selectednumbers ,
                dataType: 'json',
                success: function(dataResult)

                    var resultData = dataResult.data;
                    console.log(resultData);
                    $('#second-choice').empty();
                    $.each(JSON.parse(resultData), function(i,row)

                        $('#second-choice').append(new Option( row.id+'-'+row.nomSociete, row.id));
                    )
                
            );
        
    );

现在这个工作没有错误,除了我的控制器的逻辑是错误的这个代码向我显示最后选择的类别的供应商,即使我发送 3 个或更多类别,我希望最终结果结合所有的供应商所选类别不仅仅是列表中的最后一个,即使使用双循环也无法正常工作,请帮我修复循环逻辑

【问题讨论】:

【参考方案1】:

我找到了对我有用的方法^^感谢那些试图提供帮助的人

我的控制器:

 public function get_fournisseurs(Request $request)
    try 
      if($request->ajax()) 
            $query = $request->get('selectednumbers');

            if(empty($query)) 
                return back()->withError("Désolé, une erreur de serveur s'est produite (requête vide)");
             
            else 
                $fournisseurs=FourCats::join('fournisseurs','four_cat.four', '=', 'fournisseurs.id')
                    ->whereIn('four_cat.cat',$query)
                    ->select('fournisseurs.id','fournisseurs.nomSociete','fournisseurs.id','fournisseurs.tel')
                    ->distinct()
                    ->get();

              return json_encode(array('data'=>$fournisseurs));
               // return response()->json($fournisseurs);

            
        

     catch (\Throwable $th) 
        throw $th;
    

ajax 方法:

$('#first-choice').change(function()

        if( $('#first-choice :selected').length > 0)
            var selectednumbers = [];
            $('#first-choice :selected').each(function(i, selected) 
                selectednumbers[i] = $(selected).val();
            );
            console.log(selectednumbers);
            $.ajax(
                url: ' url('get_fournisseurs') ',
                method:'GET',
                data: selectednumbers: selectednumbers ,
                dataType: 'json',
                success: function(dataResult)

                    var resultData = dataResult.data;
                    $('#second-choice').empty();
                    $.each(resultData, function(i,row)
                        $('#second-choice').append(new Option( row.id+'-'+row.nomSociete, row.id));
                    )
                
            );
        
    );

【讨论】:

【参考方案2】:

只需删除或取消注释此行即可。 implode() 创建一个字符串,但您需要一个数组。 这就是您收到转换错误的原因。

$fournisseurs = implode($fournisseurs);

你定义 $fournisseurs=[];两次。只需取消注释即可。 那就做吧

return response()->json($fournisseurs);

你也可以用

检查json响应
$data = response()->json($fournisseurs);
print_r($data)

我不是 Laravel 专家,但我认为您不需要那个 foreach 循环,数据库中的所有内容都将在变量中,请参阅:

$fournisseurs = DB::table('yourTableName') -
  > join('fournisseurs', 'four_cat.four', '=', 'fournisseurs.id') -
  > select('fournisseurs.id', 'fournisseurs.nomSociete', 'fournisseurs.id', 'fournisseurs.tel') -
  > where('four_cat.cat', '=', $value) -
  > get();
  
return json_encode(array($fournisseurs));

【讨论】:

我刚刚编辑了我的代码,现在它并没有给我任何错误,但是我有一个逻辑问题,如何在我的最终 $fournisseurs 列表中组合每个类别的每个查询的结果? 我附上了上面的代码。也许这对你有帮助。我认为您不需要每个人都这样做。您的完整回复将在变量 $fournisseurs这是结果 数据:"[\"id\":1,\"nomSociete\":\"AGMI\",\"tel\":\"05.61.96.82.12\", \"id\":2,\"nomSociete\":\"COFTECH\",\"tel\":\"05.60.23.05.46\"]" 你启发我放弃 foreach 循环并用这个查询替换它: $fournisseurs=FourCats::join('fournisseurs','four_cat.four', '=', 'fournisseurs.id' ) ->where('four_cat.cat', 'IN',$query) ->select('fournisseurs.id','fournisseurs.nomSociete','fournisseurs.id','fournisseurs.tel') ->get( );但它没有返回任何行,我认为问题在于 $query 它是一个数组 Array ( [0] => 29 ) 我如何将它转换成这种格式:->where('four_cat.cat', 'IN' ,(29,31))。

以上是关于如何加入从我的数组的每个元素的数据库中提取的结果并在 Laravel 8 中以 json 形式返回的主要内容,如果未能解决你的问题,请参考以下文章

使用for循环从数组迭代到列表

CakePHP:在整个数组上使用 Inflector 类

请问如何使用MATLAB进行元胞数组批量提取数据。

在swift中从数组中提取值

PHP 一个字符串,如何提取其中相同的字符?

如何快速组合数组中的元素并在tableView上显示