Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel update pivot table

Tags:

laravel

In laravel I'm trying to update a row from a pivot table. I have this relationships:

Invoice.php

class Invoice extends Model
{
    public function items() {
      return $this->belongsToMany('App\Item', 'invoice_items', 'invoice_id', 'item_id')->withPivot('quantity');
  }

Item.php

class Item extends Model
{
  public function invoices() {
      return $this->belongsToMany('App\Invoice' ,'invoice_items', 'item_id', 'invoice_id')->orderBy('created_at', 'desc')->withPivot('quantity');
    }
}

InvoiceItem.php

 class InvoiceItem extends Pivot
    {
      protected $fillable = [
        'quantity',
      ];

      public function __construct(Model $parent, array $attributes,
                                  $table, $exists = false)
      {
        parent::__construct($parent, $attributes, $table, $exists);
      }
    }

and in InvoicesController.php I have method update:

public function update(Request $request, $id)
  {

    $invoice = Invoice::findOrFail($id);
    $invoice->update([
      'number' => $request->number,
      'status' => $request->status,
      'place_issue' => $request->place_issue,
      'date_issue' => $request->date_issue,
      'date_payment' => $request->date_payment,
      'description' => $request->description,
      'company_id' => $request->company_id,
      'user_id' => $request->user_id,
    ]);

    Invoice::find($id)->items()->updateExistingPivot($request->quantity, ['quantity' => $request->quantity]);

    return redirect('listInvoice');
  }

Every time I try to update the field "quantity" is the old value. What am I doing wrong?

like image 357
Magda Avatar asked Mar 14 '26 18:03

Magda


1 Answers

As each invoice may have multiple items, you can loop through and update the quantity of the item by its key.

I'm not sure what $request->quantity is returning. You may need some additional logic to ensure you are updating the correct item.

$items = $invoice->items->pluck('name', 'id')->toArray();

foreach ($items as $key => $item) {
    $invoice->items()->updateExistingPivot($key, ['quantity' => $request->quantity]);
}
like image 178
kerrin Avatar answered Mar 16 '26 08:03

kerrin



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!