好了,伙计们,我正试着重新表达我的问题。让我们看看第2次尝试的效果:)
我有一个工匠命令来计算每个用户的总收入。
用户每天获得分配的收益。但有时,我该怎么形容呢,他从另一个用户那里赚了钱。
这是assert_user_id列。如果一个用户(用户2)从另一个用户(用户1)那里获得收益,这些收益应该被添加到用户1的收益中。
id, user_id, earnings, asset_user_id
1, 1, 15, null
2, 1, 43, null
3, 1, 49, null
4, 2, 32, 1
5, 2, 25, 1
6, 2, 12, null
(在这种情况下,用户2几乎所有的钱都来自用户1的内容…他不太好,所以才给钱)
Artisan命令获取所有用户。并逐一浏览。
在foreach中我们调用用户模型上的方法
return $this->sum('earnings');
记住,我在用户1的集合内
现在我想把asset_user_id = 1的所有收益加起来。问题是,集合只保留用户1的行。
现在的问题是:
如何从用户的集合中访问所有其他行?是的,我可以在我的模型中的函数中执行User:all()。但我不认为这将是固体代码。那么我怎么做才是正确的呢?
您可能想要做的是使用foreach
遍历集合并自己获得总和。
$results = Result::all();
$sum1 = 0;
$sum2 = 0;
foreach($results as $result) {
if($result->creator_id == 1 && $result->status = 'r') {
$sum1 += (int)$result->earnings;
}
if($result->asset_creator_id == 1 && $result->status = 'r') {
$sum2 += (int)$result->earnings;
}
}
在Collection
类中还有一个sum
方法,可能更容易一些。只需发送一个回调,它返回你正在寻找的值。但是,我们必须这样做两次,每个求和一次。
$sum1 = $results->sum(function($result)
{
if($result->creator_id == '1' && $result->status = 'r') {
return $result->earnings;
}
});
$sum2 = $results->sum(function($result)
{
if($result->asset_creator_id == '1' && $result->status = 'r') {
return $result->earnings;
}
});
echo "Creator Earnings: ".$sum1;
echo "Asset Creator Earnings: ".$sum2;
排序、计数、对集合求和总是比使用db查询更糟糕的解决方案。
无论如何,你的问题是混乱的,你要求status=r
,写下status=f
的总数,所以只是一个猜测,向你展示如何使用雄辩的功能来完成它:
public function getEarningsForAssetCreator($id)
{
return $this->where('asset_creator_id', $id)
->where('status', 'f')
->sum('earnings');
}