用户有赞助商:
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;
}
用户可以给分。默认情况下,赞助商会收到它们,但如果赞助商有上限,我希望这些积分转到赞助商的无上限转介。如果所有推介都有上限,那么它与下面的级别(推荐人的推荐)做同样的事情。
如果我逐个用户为每个人拨打数据库电话,那么需要很长时间。 我怎样才能编写一个进行递归调用的作用域,直到找到树中没有上限的第一个有效引用?
这就是我要做的事情:
答案 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));
}
}
希望这是你所需要的:)