Laravel Recursive Relationships
public function childrenAccounts()
{
return $this->hasMany('Account', 'act_parent', 'act_id')->with('childrenAccounts');
}
This code returns all children accounts (recurring)
This is how you can use recursive relations:
public function childrenAccounts()
{
return $this->hasMany('Account', 'act_parent', 'act_id');
}
public function allChildrenAccounts()
{
return $this->childrenAccounts()->with('allChildrenAccounts');
}
Then:
$account = Account::with('allChildrenAccounts')->first();
$account->allChildrenAccounts; // collection of recursively loaded children
// each of them having the same collection of children:
$account->allChildrenAccounts->first()->allChildrenAccounts; // .. and so on
This way you save a lot of queries. This will execute 1 query per each nesting level + 1 additional query.
I can't guarantee it will be efficient for your data, you need to test it definitely.
This is for childless accounts:
public function scopeChildless($q)
{
$q->has('childrenAccounts', '=', 0);
}
then:
$childlessAccounts = Account::childless()->get();
I've created a package that uses common table expressions (CTE) to implement recursive relationships: https://github.com/staudenmeir/laravel-adjacency-list
You can use the descendants
relationship to get all children of an account recursively:
class Account extends Model
{
use \Staudenmeir\LaravelAdjacencyList\Eloquent\HasRecursiveRelationships;
}
$allChildren = Account::find($id)->descendants;