#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();