许多许多相同的模型


Laravel ManyToMany to same Model

好了,伙计们,我正试着重新表达我的问题。让我们看看第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');
}