Eloquent Parent-Child relationship on same model
You should use with('children')
in the children relation
and with('parent')
in the parent relations.
For your code to be recursive:
public function parent()
{
return $this->belongsTo('App\CourseModule','parent_id')->where('parent_id',0)->with('parent');
}
public function children()
{
return $this->hasMany('App\CourseModule','parent_id')->with('children');
}
Note: Make sure your code has some or the other exit conditions otherwise it will end up in a never ending loop.
here is the answer that can help you
I think you you have to do it recursively to retrieve whole tree:
$data = CourseModule::with('child_rec');
Recursive function
This may help you according to your requirement,
public function child()
{
return $this->hasMany('App\CourseModule', 'parent');
}
public function children_rec()
{
return $this->child()->with('children_rec');
// which is equivalent to:
// return $this->hasMany('App\CourseModule', 'parent')->with('children_rec);
}
// parent
public function parent()
{
return $this->belongsTo('App\CourseModule','parent');
}
// all ascendants
public function parent_rec()
{
return $this->parent()->with('parent_rec');
}
You would have to recursively get the children if you have an unknown depth like that.
Another option is to use the nested sets model instead of the adjacency list model. You can use something like baum/baum
package for Laravel for nested sets.
"A nested set is a smart way to implement an ordered tree that allows for fast, non-recursive queries." - https://github.com/etrepat/baum
With this package you have methods like getDescendants
to get all children and nested children and toHierarchy
to get a complete tree hierarchy.
Wikipedia - Nested Set Model
Baum - Nested Set pattern for Laravel's Eloquent ORM
Managing Hierarchical Data in MySQL
your model relationship should like this
// parent relation
public function parent(){
return $this->belongsTo(self::class , 'parent_id');
}
//child relation
public function children()
{
return $this->hasMany(self::class ,'parent_id');
}
public function ascendings()
{
$ascendings = collect();
$user = $this;
while($user->parent) {
$ascendings->push($user->parent);
if ($user->parent) {
$user = $user->parent;
}
}
return $ascendings;
}
public function descendings()
{
$descendings = collect();
$children = $this->children;
while ($children->count()) {
$child = $children->shift();
$descendings->push($child);
$children = $children->merge($child->children);
}
return $descendings;
}