范围

时间:2016-11-14 19:43:08

标签: sql laravel eloquent

用户有赞助商:

public function sponsor()
{
    return $this->belongsTo(User::class, 'sponsor_id');
}

用户有推介:

public function referrals()
{
    return $this->hasMany(User::class, 'sponsor_id');
}

如果用户有2个或更多推介,则会被视为上限:

public function activeReferrals()
{
    return $this->referrals()->whereActive(true);
}

public function isCapped()
{
    return $this->activeReferrals()->count() >= 2;
}

用户可以给分。默认情况下,赞助商会收到它们,但如果赞助商有上限,我希望这些积分转到赞助商的无上限转介。如果所有推介都有上限,那么它与下面的级别(推荐人的推荐)做同样的事情。

如果我逐个用户为每个人拨打数据库电话,那么需要很长时间。 我怎样才能编写一个进行递归调用的作用域,直到找到树中没有上限的第一个有效引用?

这就是我要做的事情:

1 个答案:

答案 0 :(得分:1)

请试一试......我相信这对你有用:)

public function scopeNotCappedActiveReferrals($query, $count) {
  return $query->withCount(['referrals' => function($q) {
    $q->where('active', true);
  }])->where('referrals_count', '<', $count);
}

第二部分......

// Finally you can call it with
public function allReferrals() {
  $users = User::notCappedActiveReferrals(2)->get();

  $allUsers = $this->findNotCappedActiveReferralsRecurrsively($users);
}

// Do not place this function in the model,
// place it in your Controller or Service or Repo or blahblah...
// Also, not tested... but should work :)
protected function findNotCappedActiveReferralsRecurrsively($users) {
  if(!count($user)) {
    return $users;
  }

  foreach($users as $user) {
    $moreUsers = $user->notCappedActiveReferrals(2)->get();

    return $users->merge($this->findNotCappedActiveReferralsRecurrsively($moreUsers));
  }
}

希望这是你所需要的:)