У меня есть проблема, которую я не смог решить за несколько дней. Может быть, здесь есть кто-то, кто может мне помочь.
Основная идея
У меня есть модель с именем Product. Каждый Product
может иметь несколько ProductAttributes
(belongsToMany
с поворотом).
Пример:
Product
: автомобиль
Сводная таблица для ProductAttribute
содержит значения для соответствующих атрибутов (color = blue, PS =180).
Это уже работает очень хорошо.
Проблема
Теперь я хочу реализовать пакеты продуктов. Упаковка продукта (ProductBundle
) имеет много продуктов. Но эти продукты должны иметь свои собственные сводные таблицы для своих атрибутов. Поэтому в комплекте продуктов я хочу указать, что созданный мной автомобиль имеет больше PS, чем определено в реальном продукте.
Для этого мне нужны 2 сводные таблицы для атрибутов.
То, что я уже пробовал
ProductBundle
ownToMany Product
с использованием другой сводной таблицы ProductBundle
ownToMany ProductBundleProduct
(* ProductBundleProduct
имеет поле с именем product_id
, который относится к фактическому «базовому продукту»)
В обоих сценариях у меня проблема в том, что сводная таблица для атрибутов продукта, принадлежащего к пакету продукта, не сохраняется правильно:
Product
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function productBundleAttributes()
{
return $this->belongsToMany(ProductAttribute::class,
product_bundle_product_attribute')
->withPivot($this->attributefields)-> withTimestamps();
}
контроллер
$prod = Product::findOrFail($product['id']);
$added = $productbundle->products()->save($prod, [
'custom' => $product['custom'],
'title' => $product['title'],
# 'factor' => $product['factor']
]);
/*Save attributes*/
$added->syncProductBundleAttributes($product['attributes']],
$productbundle->id);
метод синхронизации
public function syncProductBundleAttributes(
array $attributes,
int $id
) {
$this->checkProductAttributesRecursively(collect($attributes)->transform(function (
$attributes
) use (
$id
) {
$attribute['product_bundle_id'] = $id;
$attribute['product_attribute_id'] = $attribute['id'];
return $attribute;
})->toArray());
$this->productBundleAttributes()->attach($this->result);
return $this->result;
}
К сожалению, это означает, что одновременно сохраняется только один атрибут.