Я борюсь с этой проблемой в течение некоторого времени, не могу найти решение, поэтому я надеюсь на какую-то помощь.Laravel - получить счет в древовидной структуре, где count в parent - сумма отсчетов от детей
У меня есть две связанные модели, ModelOne
, что также связано с собой и может иметь бесконечное количество детей, внуков и т. Д., И связано с ModelTwo
.
class ModelOne extends Model
{
...
public function model_two()
{
return $this->hasMany(ModelTwo::class, 'foreign_key');
}
//recursively get all children, grandchildren etc.
public function children() {
return $this->hasMany(ModelOne::class, 'foreign_key')->with('children');
}
public function parent() {
return $this->belongsTo(ModelOne::class, 'foreign_key');
}
}
class ModelTwo extends Model
{
...
public function model_one()
{
return $this->belongsTo(ModelOne::class, 'foreign_key');
}
}
В моей функции получить от ModelOne
у меня есть:
public function get($id = null) {
return is_null($id) ?
ModelOne::withCount('model_two')->get() :
ModelOne::withCount('model_two')->where('id', $id)->first();
}
и это дает мне хороший одномерный массив объектов (или один объект), с графом форме, связанной ModelTwo
, что мне нужно, но с индивидуальным подсчетом для каждого связанного объекта.
Что мне нужно для каждого ModelOne
объекта в обратном массиве, который имеет детей, внуков и т.д., чтобы рассчитывать в этом объекте будет сумма подсчетов всех своих детей, внуков и т.д. Так, например, если У меня есть один объект из ModelOne
с id = 2, parent_id = 1 и count 3, а другой объект с id = 3, parent_id = 1 и count 2, затем для объекта с id = 1, который является родительским для предыдущих двух, счет будет равен 5. Эта логика продолжается в дереве для всех узлов.
[
{
"id":1
"parent_id":"NULL",
"model_two_count":5
},
{
"id":2
"parent_id":1,
"model_two_count":3
},
{
"id":3
"parent_id":1,
"model_two_count":2
}
...
]