Добрый день.
Есть 2 модели:
Service (name, parent_id) + обвязка из lazychaser/laravel-nestedset
class Service extends Model
{
use NodeTrait;
protected $table = 'services';
public function parent()
{
return $this->belongsTo(Service::class, 'parent_id');
}
public function attributes()
{
return $this->belongsToMany(Attribute::class, 'service_attribute');
}
public function allAttributesUp()
{
$ids = $this->ancestors->pluck('id')->merge($this->id)->toArray(); // ->toArray() [0]
$parentAttributes = Attribute::whereHas('services', function ($q) use ($ids) {
$q->whereIn('services.id', $ids);
})->groupBy('id')->get();
return $parentAttributes;
}
}
и
class Attribute extends Model
{
protected $table = 'attributes';
}
Сущности объеденены на уровне
БД связочной таблицей
service_attribute.
Необходимо в дочернем элементе вытаскивать все аттрибуты собстевенные и всех родителей, кникально без повторов.
Написал для этого дела тест с недостающим звеном:
class AttributeValueTest extends TestCase
{
public function test_check_services_hierarchy_by_node()
{
$parentService = factory(Service::class)->create();
$childService = new Service();
$childService->name = $this->faker->colorName;
$parentService->appendNode($childService);
$this->assertNotNull($childService->id);
$qtyParentAttributes = 2;
$parrentAttributes = factory(Attribute::class, $qtyParentAttributes)->create();
$parentService->attributes()->sync($parrentAttributes->pluck('id'));
$qtyChildAttributes = 3;
$childAttributes = factory(Attribute::class, $qtyChildAttributes)->create();
$childService->attributes()->sync($childAttributes->pluck('id'));
self::assertEquals($parentService->attributes()->count(), $qtyParentAttributes);
self::assertEquals($childService->attributes()->count(), $qtyChildAttributes);
// self::assertEquals($childService->allAttributesUp()->count(), $qtyParentAttributes + $qtyChildAttributes);
}
}
Как можно реализовать метод
allAttributesUp в
Service без рекурсии?