首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有分项目计数的雄辩请求

有分项目计数的雄辩请求
EN

Stack Overflow用户
提问于 2018-05-15 20:35:55
回答 3查看 359关注 0票数 0

我有两张桌子:

  • 价值: id,created_at,updated_at,deleted_at
  • 片段: id,valuechain_id (外键),created_at,updated_at,deleted_at

和枢轴表(这里不太重要)。

我有一个处理sql请求的方法..。

  • $valuechains列表给出了所有未(软)删除的价值链的列表。
  • $valuechainCount统计已发布的值链的数量
  • $segmentCount计算每个价值链的段数。

我尝试使用map函数来添加一个列,其中包含每个价值链的段数。

代码语言:javascript
复制
public function vcListAndSegmentCount() {
    $valuechainLists = Valuechain::select('valuechains.id', 'lang_valuechain.vcname', 'lang_valuechain.vcshortname')
        ->join('lang_valuechain', 'valuechains.id', '=', 'lang_valuechain.valuechain_id')
        ->join('langs', 'lang_valuechain.lang_id', '=', 'langs.id')
        ->where('langs.isMainlanguage', '=', '1')
        ->whereNull('valuechains.deleted_at')
        ->get();

    $valuechainCount = Valuechain::whereNull('valuechains.deleted_at')->count();

    for ($i=0; $i < $valuechainCount; $i++) {
        $segmentCount[$i] = Segment::whereNull('segments.deleted_at')
            ->where('valuechain_id', '=', $valuechainLists[$i]->id)->count();
    }

    $valuechainLists = $valuechainLists->map(function ($record) use ($segmentCount) {
        $vclists = array_first($segmentCount, function ($value, $key) use ($record) {
            return $value['id'] === $record['valuechain_id'];
        });
        $record['count'] = $vclists;
        return $record;

    });
    dd($valuechainLists);
}

map方法添加一个列my output集合。不幸的是,新的收藏并没有给我每一个价值链正确的片段数.它只增加了一个价值..。

以下是我所得到的:

代码语言:javascript
复制
Collection {#380 ▼
  #items: array:4 [▼
    0 => Valuechain {#450 ▼
      ...
      #attributes: array:4 [▼
        "id" => 1
        "vcname" => "Génétique"
        "vcshortname" => "Génétique"
        "count" => 6
      ]
      #original: array:3 [▶]
      ...
    }
    1 => Valuechain {#451 ▼
      ...
      #attributes: array:4 [▼
        "id" => 2
        "vcname" => "Biotruc"
        "vcshortname" => "Biotruc"
        "count" => 6
      ]
      ...
    }
    2 => Valuechain {#452 ▼
      ...
      #attributes: array:4 [▼
        "id" => 3
        "vcname" => "VC3"
        "vcshortname" => "VC3"
        "count" => 6
      ]
      ...
    }
    3 => Valuechain {#453 ▼
      ...
      #attributes: array:4 [▼
        "id" => 4
        "vcname" => "VC4"
        "vcshortname" => "VC4"
        "count" => 6
      ]
      #original: array:3 [▶]
      ...
    }
  ]
}

我得到6,6,6和6,而计数应该是6,5,4,4.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-23 08:19:10

如果您正在使用Laravel >= 5.2,并且已经在模型上定义了关系,则可以使用withCount()方法。

会是这样的:

代码语言:javascript
复制
 Valuechain::select('valuechains.id', 'lang_valuechain.vcname', 'lang_valuechain.vcshortname')
    ->withCount(['segments' => function ($query) {
        $query->whereNull('deleted_at);
    }])
    ->join('lang_valuechain', 'valuechains.id', '=', 'lang_valuechain.valuechain_id')
    ->join('langs', 'lang_valuechain.lang_id', '=', 'langs.id')
    ->where('langs.isMainlanguage', '=', '1')
    ->whereNull('valuechains.deleted_at')
    ->get()

或者,如果您的Segment模型使用了SoftDeletes特性,那么它会更简单一些:

代码语言:javascript
复制
Valuechain::select('valuechains.id', 'lang_valuechain.vcname', 'lang_valuechain.vcshortname')
    ->withCount('segments')
    ->join('lang_valuechain', 'valuechains.id', '=', 'lang_valuechain.valuechain_id')
    ->join('langs', 'lang_valuechain.lang_id', '=', 'langs.id')
    ->where('langs.isMainlanguage', '=', '1')
    ->whereNull('valuechains.deleted_at')
    ->get()
票数 1
EN

Stack Overflow用户

发布于 2018-05-16 17:26:27

将count值添加为属性而不是数组元素。

代码语言:javascript
复制
 $valuechainLists = $valuechainLists->map(function ($record) use ($segmentCount) {
     $vclists = array_first($segmentCount, function ($value, $key) use ($record) {
         return $value['id'] === $record['valuechain_id'];
     });
     $record->count = $vclists;
     return $record;
 });

我改变了

$record‘’count‘= $vclists;

$record->count = $vclists;

票数 0
EN

Stack Overflow用户

发布于 2018-05-18 14:56:43

添加引用:&$segmentCount

代码语言:javascript
复制
$valuechainLists = $valuechainLists->map(function ($record) use (&$segmentCount) {....

而且,我也不知道您的array_first函数在做什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50358792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档