我有一个递归查询,返回特定线程的子项及其子项的 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".
}
有没有办法在没有多少查询的情况下执行此操作?如果树很深,它会做很多查询。