@EVOSandru6

Как в eloquent получить все уникальные связанные аттрибуты, собственные и потомков в иерархической модели NestedSet?

Добрый день.

Есть 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 без рекурсии?
  • Вопрос задан
  • 106 просмотров
Пригласить эксперта
Ответы на вопрос 1
@EVOSandru6 Автор вопроса
Добавил в Service метод:

public function allAttributesUp()
    {
        $ids = $this->ancestors->pluck('id')->merge($this->id)->toArray();

        $parentAttributes = Attribute::whereHas('services', function ($q) use ($ids) {
            $q->whereIn('services.id', $ids);
        })->groupBy('id')->get();

        return $parentAttributes;
    }


Но это вариант мне не нравится, хотелось бы узнать, как в данном случае можно обратиться к аттрибутам через через что-то-типа $this->ancestors->attributes?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы