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(外键)、创建时、更新时、删除时
- $valuechains list为我提供了所有未(软)删除的价值链的列表
- $valuechainCount统计已发布的ValueChain数量
- $SECTIONCOUNT统计每个价值链的段数
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()