Запросы отношений в трехсторонней сводной таблице

Рейтинг: 1Ответов: 0Опубликовано: 09.02.2023

Мне выпала задача поработать с трехсторонней сводной таблицей, однако я никак не могу получить все свойства и их значения для конкретного товара.

У меня три модели Product, Property и PropertyValue.

Модель Product:

public function properties() :BelongsToMany
    {
        return $this->belongsToMany(Property::class,'product_property', 'product_id', 'property_id')
            ->with('values')
            ->withPivot('property_value_id')
            ->orderBy('order');
    }

public function values() :BelongsToMany
    {
        return $this->belongsToMany(PropertyValue::class,'product_property', 'product_id', 'property_value_id');
    }

Модель Property:

public function products() :BelongsToMany
    {
        return $this
            ->belongsToMany(Product::class, 'product_property', 'property_id', 'product_id');
    }

    public function values() :BelongsToMany
    {
        return $this->belongsToMany(PropertyValue::class, 'product_property','property_id','property_value_id')->withPivot('product_id');
    }

Модель PropertyValue:

public function properties() :BelongsToMany
{
    return $this
        ->belongsToMany(Property::class, 'product_property','property_id','property_value_id');
}

public function products() :BelongsToMany
{
    return $this
        ->belongsToMany(Product::class, 'product_property','property_value_id','product_id');
}

Миграция сводной таблицы product_property:

public function up()
    {
        Schema::create('product_property', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->foreignId('product_id')->constrained()->onDelete('cascade');
            $table->foreignId('property_id')->constrained()->onDelete('cascade');
            $table->foreignId('property_value_id')->constrained()->onDelete('cascade');
        });
    }

Я спокойно могу получить Product и далее получить либо его свойства Property

$product->properties

либо только значения его свойств PropertyValue

$product->values

Однако я никак не могу получить цепочку:

Товар->Его свойства->Значения этих свойств у выбранного товара. 

Если я делаю что-то типа

$product->properties()->first()->values

то получаю все PropertyValue выбранного Property в сводной таблице, а не для конкретно выбранного Product.

Моя задача сложна тем, что я не могу внести никакие изменения в БД. Подскажите пожалуйста, как не меняя сводную таблицу получить цепочку

Товар->Его свойства->Значения этих свойств у выбранного товара.

Ответы

Ответов пока нет.