Запросы отношений в трехсторонней сводной таблице
Мне выпала задача поработать с трехсторонней сводной таблицей, однако я никак не могу получить все свойства и их значения для конкретного товара.
У меня три модели 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.
Моя задача сложна тем, что я не могу внести никакие изменения в БД. Подскажите пожалуйста, как не меняя сводную таблицу получить цепочку
Товар->Его свойства->Значения этих свойств у выбранного товара.
Источник: Stack Overflow на русском