Php 具有子项计数的雄辩请求

Php 具有子项计数的雄辩请求,php,orm,eloquent,laravel-5.5,Php,Orm,Eloquent,Laravel 5.5,我有两张桌子: Valuechains:id、已创建、已更新、已删除 段:id、valuechain\u id(外键)、创建时、更新时、删除时 和透视表(在这里并不重要) 我有一个sql请求的方法 $valuechains list为我提供了所有未(软)删除的价值链的列表 $valuechainCount统计已发布的ValueChain数量 $SECTIONCOUNT统计每个价值链的段数 我尝试使用map函数来添加一列,其中包含每个价值链的段数 public function vcLis

我有两张桌子:

  • Valuechains:id、已创建、已更新、已删除
  • 段:id、valuechain\u id(外键)、创建时、更新时、删除时
和透视表(在这里并不重要)

我有一个sql请求的方法

  • $valuechains list为我提供了所有未(软)删除的价值链的列表
  • $valuechainCount统计已发布的ValueChain数量
  • $SECTIONCOUNT统计每个价值链的段数
我尝试使用map函数来添加一列,其中包含每个价值链的段数

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);
}

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

将计数值作为属性而不是数组元素添加

$valuechainLists=$valuechainLists->map(函数($record)使用($segmentCount){
$vclists=array\u first($segmentCount,function($value,$key)use($record){
返回$value['id']==$record['valuechain_id'];
});
$record->count=$vclists;
返回$record;
});
我变了

$record['count']=$vclists


$record->count=$vclists

添加参考:
和$segmentCount

$valuechainLists = $valuechainLists->map(function ($record) use (&$segmentCount) {....

另外,我不确定您的
array\u first
函数在做什么。

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

事情会是这样的:

 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()
或者,如果您的
模型使用了
软删除
特性,那么它就简单了一点:

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()

请添加一些示例数据以及预期与实际结果的对比。我更新了问题…当
$segmentCount
只是一个整数数组时,
$segmentCount
的内容是什么?它返回:[6,5,4,4]如何访问
$value['id']
呢?您是否获得了与以前相同的输出?我已经经历过几次这个问题,这对我很有效。实际上,问题是每个集合对象都会被最后一个值覆盖。例如,上次记录的$vclists值为6。
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()