In our web application each user can create multiple nested category by selecting the parent which that specified with category_id column.
Schema::create('categories', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('category_id')->index()->nullable();
$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
$table->string('category_name');
...
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
});
now you supposed one of our user created this category structure:
multiple nested categories children are unlimited, that means every category can be have child and we can’t use any static or fixed number for example in for statement to sync the category to specify users.
my question is how can i set specify users to all of categories from parent?
this query only can set users for single child of parent. you can suppose 1,3,4,5,6,7 in above screen shot and not working for 2 and all of their children
children of parent category can be unlimited and how can we set users from the parent to all of nested and children categories?
$category = Category::whereId($request->category_id)->whereNull('category_id')->with('childrenCategories')->first();
$category->users()->sync($request->users);
foreach ($category->childrenCategories as $category) {
$category->users()->sync($request->users);
}
simplified output of query:
AppEntitiesCategory {#2114 ▼
...
#attributes: array:11 [▶]
#original: array:11 [▶]
...
#relations: array:1 [▼
"childrenCategories" => IlluminateDatabaseEloquentCollection {#2118 ▼
#items: array:4 [▼
0 => AppEntitiesCategory {#2133 ▶}
1 => AppEntitiesCategory {#2134 ▶}
2 => AppEntitiesCategory {#2135 ▼
...
#attributes: array:11 [▶]
#original: array:11 [▶]
...
#relations: array:1 [▼
"categories" => IlluminateDatabaseEloquentCollection {#2138 ▼
#items: array:1 [▼
0 => AppEntitiesCategory {#2157 ▼
...
#attributes: array:11 [▶]
#original: array:11 [▶]
...
#relations: []
...
}
]
}
]
...
}
3 => AppEntitiesCategory {#2136 ▶}
]
}
]
...
}
Advertisement
Answer
You have to use a recursive function like below:
private function syncCategories($category,$request){
if($category->childrenCategories->first()){
foreach ($category->childrenCategories as $childCategory) {
$childCategory->users()->sync($request->users);
$this->syncCategories($childCategory);
}
}
}
