Laravel - 儿童和孙子的递归查询(重构并使其快速)

时间:2016-05-14 01:40:21

标签: php mysql laravel recursion

我有一个递归查询,返回特定线程的子项及其子项的 double posf = model.stars == 1 ? 0 : model.stars == 2 ? 0.25 : model.stars == 3 ? 0.5 : model.stars == 4 ? 0.75 : model.stars == 5 ? 1 : 0; double negf = model.stars == 1 ? 1 : model.stars == 2 ? 0.75 : model.stars == 3 ? 0.5 : model.stars == 4 ? 0.25 : model.stars == 5 ? 0 : 0; rating.positif += posf; rating.negatif += negf; rating.ratingcount += 1; rating.ratingavg = Math.Round((((rating.positif / rating.ratingcount) * 4) + 1) * 2, 0) / 2; rating.calcSort = ((rating.positif + 1.9208) / (rating.positif + rating.negatif) - 1.96 * Math.Sqrt((rating.positif * rating.negatif) / (rating.positif + rating.negatif) + 0.9604) / (rating.positif + rating.negatif)) / (1 + 3.8416 / (rating.positif + rating.negatif)); 等。我在递归期间将id存储为由数组分隔的字符串,以便稍后使用id来获取数组。

然而,它根本没有效率。它将执行的查询数量取决于树的深度。如果树很深,可能需要很长时间才能获得所有信息,这是无效的。

我的表:

explode()

这是我的代码:

id | parent_id |
----------------
1  |         0 | 
2  |         1 |
3  |         1 |
4  |         3 |

要调用方法,我只需执行

public function children()
{
    $all = '';
    $all .= $this->id;
    if ($this->hasSubforum()) {
        foreach ($this->subforums()->with('subforums')->get() as $subforum) {
            $all .= ',' . $subforum->children();
        }
    }
    return $all; //returns something like "2,8,10,22".

}

有没有办法在没有多少查询的情况下执行此操作?如果树很深,它会做很多查询。

0 个答案:

没有答案