代码之家  ›  专栏  ›  技术社区  ›  Nenad M

Laravel:Count-through有多个并作为数组输出

  •  1
  • Nenad M  · 技术社区  · 7 年前

    我制作了谷歌图表,下面是我的代码:

    控制器:

    $settlements = Settlement::where('town_id', Auth::user()->town_id)
      ->where('reon_id', '1')
      ->get();
    

    查看:

    @foreach ($settlements as $settlement)
         [
           '{{$settlement->name}}',
            {{$settlement->members->count()}},
            {{$settlement->members->where('cipher_id', '0')->count()}},
         ],
     @endforeach
    

    这给了我一个很好的图表,上面有每个营地的成员数量,还有一个sam条,其中cipher\u id==0。这很好用。

    现在,我需要计算每个营地有多少成员作为一个数组。我尝试过这样的sam,但都是在我的控制器中:

    $settlements = Settlement::where('town_id', Auth::user()->town_id)
      ->where('reon_id', '1')
      ->get();
    
    foreach ($settlements as $settlement) {
      $sett = $settlement->members->count();
    }
    

    但这只输出了一个定居点的数量,即它拥有多少成员。(抱歉英语不好)

    我需要一个所有营地的数组。

    也许这是错误的方法,因为我计划再创建一个数组,其中cipher\u id==0,然后计算所有这些数字的百分比。例如:

    第一个阵列:

    256 148 312

    第二个阵列:

    100 58 211

    因此,结果将是:

    39.0625 39.18918919 67.62820513

    我希望我能很好地解释为什么我要用这种方式来计数。这个问题的解决方案是什么?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Alexey Mezenin    7 年前

    您可以使用 withCount() 计算关系的方法:

    $settlements = Settlement::where('town_id', Auth::user()->town_id)
        ->withCount('members')
        ->where('reon_id', '1')
        ->get();
    

    它将添加 members_count 属性到每个 Settlement 对象

    从…起 the docs :

    如果要计算关系中的结果数而不实际加载它们,可以使用 withCount 方法,该方法将放置 {relation}_count 结果模型上的列

    当然,您可以使用自己的方式,但在这种情况下,您需要首先加载数据以避免N+1问题:

    ->with('members')
    

    然后计算成员数:

    foreach ($settlements as $settlement) {
        $sett[] = $settlement->members->count();
    }
    

    此外,这将把所有成员加载到内存中。如果您不想这样,请使用 withCount()

    推荐文章