【问题标题】:get duplicates from whereIn - Laravel从 whereIn 获取重复项 - Laravel
【发布时间】:2020-03-28 01:29:41
【问题描述】:

我目前正在尝试从具有列 id 和 name 的 X 表中获取数据。我在项目中使用 Laravel 并进入其中以从 X 表中获取多个数据。它工作完美,当我将请求数据发送为 (1,2,3,4) 时,我得到了预期的响应。但是当我以 (1,2,3,4,2) 发送请求时,它正在为 id 1,2,3,4 提供响应,但它不会再次检索到 id 2 的重复数据。 以下是我的查询

 X::whereIn('id',$request->XIds)->get()->toArray();

假设 $request->XIds 是 [1,2,3,4,2].. 因为 2 是重复的。 我的问题是如何通过查询获取重复数据,以便当我发送具有重复条目的请求时,我可以获得具有重复数据的响应。

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    好吧,你可以根据需要正确投影数据:

    $data = X::whereIn('id',$request->XIds)->get()->getDictionary();
    
    
    return collect($request->XIds)->map(function ($id) use ($data) {
          return $data->get($id)->toArray(); 
    })->all();  
    

    但是,我建议您尝试检查一下您的逻辑,因为多次发送相同的数据没有客观优势。

    【讨论】:

      【解决方案2】:

      扩展@apokryfos 解决方案。为了返回对象的一维集合,您应该使用->first()

      $data = X::whereIn('id',$request->XIds)->get()->getDictionary();
      
      return collect($request->XIds)->map(function ($id) use ($data) {
            return $data->get($id)->first(); 
      });  
      

      $数据输出:

      映射的 $data 输出:

      【讨论】:

        【解决方案3】:

        从数据库中获取数据后,必须在 PHP 中进行。

        $collection = X::whereIn('id', $request->XIds)->get()->keyBy('id');
        
        $counts = array_count_values($request->XIds);
        
        foreach ($counts as $id => $count) {
            if ($count === 1) {
                 continue;
            }
            for ($i = 0; $i < $count - 1; $i++) {
                $collection->push($collection->get($id));
            }
        }
        
        $yourFinalArray = $collection->values()->toArray();
        

        【讨论】:

          【解决方案4】:

          给你。

          $result = X::whereIn('id', $request->XIds)->get();
          $ids = $result->pluck('id')->toArray();
          $resultInArray = $result->toArray();
          $finalResult = collect($request->XIds)->map(function ($id) use($ids, $resultInArray) {
                  return $resultInArray[array_search($id, array_values($ids))];
          });
          

          【讨论】:

            【解决方案5】:

            whereIn('id',array(1,2,3,4,2)) 将返回与给定数组中的 id 字段值匹配的数据,因此它不会返回重复值,基本上它检查 id 是否在数组中?如果是 inarray 则选择该数据。

            如果你需要重复数据,你必须手动编写这样的代码:

            $my_data=[];
            
             foreach($request->XIds as $id){
                 $xmodel=X::where('id',$id)->first();
                 if($xmodel){
                   array_push($my_data,$xmodel);
                 }
             }
            
            return response()->json($my_data,200);
            

            【讨论】:

            • 如果你有 1000 个 Id,这段代码会执行 1000 次查询
            猜你喜欢
            • 1970-01-01
            • 2019-02-03
            • 1970-01-01
            • 1970-01-01
            • 2014-05-10
            • 2021-03-19
            • 1970-01-01
            • 2018-09-27
            • 2017-05-30
            相关资源
            最近更新 更多