Сводная модель Laravel с дополнительными атрибутами

#php #laravel #many-to-many #pivot-table

#php #laravel #многие ко многим #сводная таблица

Вопрос:

У меня есть система управления каталогом товаров.

Элемент каталога (модель):

  Schema::create('catalog_items', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->float('price');
        $table->float('deposit')->nullable();
        $table->timestamps();
    });
  

Ценообразование (модель):

  Schema::create('pricings', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name',127);
        $table->boolean('enable')->default(true);
        $table->timestamps();
    });
  

CatalogItemPricingPivot(сводная модель):

 Schema::create('catalog_item_pricing', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->bigInteger('catalog_item_id');
        $table->bigInteger('pricing_id');
        $table->float('discount')->nullable()->default(0);
        $table->timestamps();
    });
  

Теперь, когда я хочу обновить цены для CatalogItem, я делаю это:

 $CatalogItem->pricings()->sync([
    1 => array:1 [
        "discount" => "25.00"
    ]
]);
  

Это также может быть

  $CatalogItem->pricings()->sync([
    1 => array:1 [
        "discount" => "25.00"
    ],
    5 => array:1 [
        "discount" => "12.25"
    ]
]);
  

если я печатаю модель в observer, я не получаю поле скидки в оригиналах

  public function boot()
{

    CatalogItemPricingPivot::updated(function($model){
        dd($model);
    });
}
  

Результат

 AppPivotsCatalogItemPricingPivot {
  table: "catalog_item_pricing"
  exists: true
  wasRecentlyCreated: false
  attributes: array:4 [
    "catalog_item_id" => 172
    "pricing_id" => 1
    "discount" => "25.00"
  ]
  original: array:2 [
    "catalog_item_id" => 172
    "pricing_id" => 1
  ]
  changes: array:2 [
    "discount" => "25.00"
  ]
  casts: []
}
  

и кажется, что это немного меняет его.

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

Редактировать:

ОСНОВНАЯ цель — получить CatalogItemPricingPivot, где обновляется

Спасибо.

Ответ №1:

Чтобы обновить уже прикрепленные сводные данные, вы должны использовать updateExistingPivot метод. https://laravel.com/docs/8.x/eloquent-relationships#updating-many-to-many-relationships

Вместо

 $CatalogItem->pricings()->sync([
    1 => array:1 [
        "discount" => "25.00"
    ]
]);
  

попробуйте это

 $CatalogItem->pricings()->each(function ($pricing) use ($CatalogItem) {
    $CatalogItem->pricings()->updateExistingPivot($pricing, [
        "discount" => "23.00"
    ]);
});
  

Комментарии:

1. как насчет новой сводной модели?

2. Да, но я также использую синхронизацию для отсоединения

3. Поэтому мне нужны оба случая, сначала синхронизация, а затем обновление существующего файла

4. после каждого, как я могу узнать, изменилась ли сводная таблица?

Ответ №2:

Видел ваш пост на upwork.

попробуйте добавить ->withPivot('discount'); к взаимосвязи

Комментарии:

1. существует $this->belongsToMany(Pricing::class) ->using(CatalogItemPricingPivot::class) ->withPivot(‘скидка’) -> withTimestamps();