【发布时间】:2014-12-26 11:18:44
【问题描述】:
我正在 Laravel 中开发一个项目。我有一个可以有父或子的 Account 模型,所以我的模型设置如下:
public function immediateChildAccounts()
{
return $this->hasMany('Account', 'act_parent', 'act_id');
}
public function parentAccount()
{
return $this->belongsTo('Account', 'act_parent', 'act_id');
}
这很好用。我想要做的是让所有孩子都在某个帐户下。目前,我正在这样做:
public function allChildAccounts()
{
$childAccounts = $this->immediateChildAccounts;
if (empty($childAccounts))
return $childAccounts;
foreach ($childAccounts as $child)
{
$child->load('immediateChildAccounts');
$childAccounts = $childAccounts->merge($child->allChildAccounts());
}
return $childAccounts;
}
这也有效,但我不得不担心它是否很慢。这个项目是我们在工作中使用的一个旧项目的重写。我们将有数千个帐户迁移到这个新项目。对于我拥有的少数测试帐户,此方法不会造成性能问题。
有没有更好的解决方案?我应该只运行原始查询吗? Laravel 有什么可以处理的吗?
总结 对于任何给定的帐户,我想要做的是在单个列表/集合中获取每个子帐户及其孩子的每个孩子等等。一张图:
A -> B -> D
|--> C -> E
|--> F
G -> H
如果我运行 A->immediateChildAccounts(),我应该得到 {B, C}
如果我运行 A->allChildAccounts(),我应该得到 {B, D, C, E, F}(顺序无关紧要)
同样,我的方法有效,但似乎我执行的查询太多了。
另外,我不确定在这里问这个是否可以,但它是相关的。如何获取不包含子帐户的所有帐户的列表?所以基本上与上述方法相反。这样用户就不会尝试为帐户提供已经是孩子的父母。使用上面的图表,我想要(在伪代码中):
Account::where(account_id 不在 (A->allChildAccounts()))。所以我会得到 {G, H}
感谢您的任何见解。
【问题讨论】: