一个问题在我脑海中浮现了2天,并想知道是否有可能在laravel和MySQL中实现这种类型的树结构。
(首先,看看附上的图片。谢谢)
假设我们的平台使用引用系统,最初是用户“A”连接。现在,该用户'A'进一步指3个人'B','C','D'。现在,A的总参考数是3(因为它指3个人)。
现在,让B进一步引用'E','F'和'C'进一步引用'G','H','I'和'D'指的是0.所以,现在每个人的引用都是“D” = 0“,”C = 3“,”B = 2“。而这些引用也将加在“A”上。所以,它有“A = 8”。
现在,'G'指的是'J',所以'G'得+ 1,'C'得+ 1,'C'得'A',所以'A'也得+ 1。现在,总指的是每个人: “j = 0”,“G = 1”,“H = 0”,“I = 0”,“D = 0”,“E = 0”,“f = 0”,“B = 2”,“C = 4(因为G也指J)“,”A = 9(他指的是9个childers)“
链条一直持续到A总得分为40。
简单来说,如果一个人引用另一个人,那么它将获得+1,并且他所引用的父母也会获得+1,依此类推,直到父母达到40,该链继续。
我知道,这是用户和引用之间的一对多关系,我们可以使用数据透视表,但是,我们如何实现这种类型的逻辑。给我一些提示。感谢。
答案 0 :(得分:1)
我已经用while
循环写了一些可以帮助你的东西。
public function totalReferredBy(User $user)
{
// Initialise the queue to contain only the provided user
$queue = collect([$user]);
// This collection will eventually contain all of the "child"/referred users
$results = collect();
while ($queue->isNotEmpty() > 0) {
// Run a where in query to select all the referred users of the users in the queue.
$referredUsers = User::whereIn('referred_by', $queue->pluck('id'))->get();
// Merge the referredUsers we have found in the database with the results collection, so we can later count.
$results = $results->merge($referredUsers);
// Make the referredUsers we have just found in the database, the new queue. If the query did not return any
// referred users, the queue count would be 0 and the loop will exit.
$queue = $referredUsers;
}
// Now we should have all of the given user's "children" and "children of children" in the $results collection.
// We just need to return the count of that collection to get the total number of users that have been referred.
return $results->count();
}
你可以像这样使用它:
$user = User::find(1);
$totalReferred = $this->totalReferredBy($user);
然后,如果您的应用程序在用户达到40或更多推荐时执行某些操作,您可以执行以下操作:
if ($this->totalReferredBy($user) > 40) {
// Do something
}
这假设您在referred_by
表格上有一个users
列。