I'm working on a project in Laravel. I have an Account model that can have a parent or can have children, so I have my model set up like so:
public function immediateChildAccounts()
{
return $this->hasMany('Account', 'act_parent', 'act_id');
}
public function parentAccount()
{
return $this->belongsTo('Account', 'act_parent', 'act_id');
}
This works fine. What I want to do is get all children under a certain account. Currently, I'm doing this:
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有办法处理吗?
In summary
A -> B -> D
|--> C -> E
|--> F
G -> H
If I run A->immediateChildAccounts(), I should get {B, C}
If I run A->allChildAccounts(), I should get {B, D, C, E, F} (order doesn't matter)
Again, my method works, but it seems like I'm doing way too many queries.
另外,我不确定在这里问这个是否合适,但这是相关的.如何获得包含don't个子帐户的所有帐户的列表?所以基本上与上述方法相反.这样,用户就不会试图给一个帐户指定一个已经是其子帐户的父帐户.使用上面的图表,我想要(在伪代码中):
Account::where(account_id not in (A->allChildAccounts())). So I would get {G, H}
谢谢你的真知灼见.