如何在mysql和laravel

时间:2017-09-09 09:33:37

标签: php mysql laravel laravel-5 database-design

一个问题在我脑海中浮现了2天,并想知道是否有可能在laravel和MySQL中实现这种类型的树结构。

enter image description here

(首先,看看附上的图片。谢谢)

假设我们的平台使用引用系统,最初是用户“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,该链继续。

我知道,这是用户和引用之间的一对多关系,我们可以使用数据透视表,但是,我们如何实现这种类型的逻辑。给我一些提示。感谢。

1 个答案:

答案 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列。