Laravel ManyToMany为同一型号

时间:2014-07-25 15:13:04

标签: php laravel laravel-4

好的伙计们,我想改写一下我的问题。让我们看看try 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一起经历。

在foreach中我们称之为用户模型上的方法

return $this->sum('earnings');

请记住,我在用户1的集合中。

现在我想将所有收入汇总到asset_user_id = 1。问题是,收集仅保留用户1的行。

现在的问题是:

如何从用户集合中访问所有其他行。是的,我可以做我的模型中我的函数中的User:all()。但我不认为这将是SOLID代码。那么我该如何正确地做到这一点?

2 个答案:

答案 0 :(得分:0)

您可能想要做的是使用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;
    }
}

sum类中还有一个Collection方法可能更容易一些。只需向它发送一个回调函数,它将返回您要查找的值。我们必须做两次,一次为你要找的每一笔钱。

$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;

答案 1 :(得分:0)

对数据进行排序,计数,求和将总是比使用db查询更糟糕的解决方案。

无论如何你的问题很混乱,你要求status=r,为status=f写总数,所以只是一个猜测,向你展示如何用Eloquent功能实现这一目标:

public function getEarningsForAssetCreator($id)
{
  return $this->where('asset_creator_id', $id)
           ->where('status', 'f')
           ->sum('earnings');
}