neddy11
10 months ago

Help with updating model

Posted 10 months ago by neddy11

I'm having a problem with updating model. So the output the front gives is:

array:16 [▼
  "name" => "template 11"
  "client" => "1"
  "address" => "Some address"
  "number" => "12312312"
  "services" => array:2 [▼
    0 => array:8 [▼
      "name" => "Name 1"
      "unit" => "kg"
      "amount" => "1"
      "price" => "120"
      "discount" => "0"
      "tax_rate" => "25"
      "id" => "28"
    ]
    1 => array:8 [▼
      "name" => "Name 2"
      "unit" => "m"
      "amount" => "1"
      "price" => "90"
      "discount" => "5"
      "tax_rate" => "10"
      "id" => "29"
    ]
  ]
  "exchange_rate" => "USD"
  "payment_method" => "Cash"
  "creation_date" => "2019-02-11"
  "pay_date" => "2019-02-11"
  "delivery_date" => "2019-02-11"
  "note" => "aaa"
  "id" => "1"
]

Template has a hasMany relationship with services.

The problem is that the number of services can vary (the user can even delete one of these mentioned here and add another in some later update)...so the next update request could have services: Service "Name1" and some other two services "Name3" and "Name4" without Name2, so that one should be removed and the other two added.

array:16 [▼
  "name" => "template 11"
  "client" => "1"
  "address" => "Some address"
  "number" => "12312312"
  "services" => array:2 [▼
    0 => array:8 [▼
      "name" => "Name 1"
      "unit" => "kg"
      "amount" => "1"
      "price" => "120"
      "discount" => "0"
      "tax_rate" => "25"
      "id" => "28"
    ]
    1 => array:8 [▼
      "name" => "Name 3"
      "unit" => "lbs"
      "amount" => "1"
      "price" => "90"
      "discount" => "5"
      "tax_rate" => "10"
      "id" => ""
    ]
    1 => array:8 [▼
      "name" => "Name 4"
      "unit" => "lbs"
      "amount" => "1"
      "price" => "90"
      "discount" => "5"
      "tax_rate" => "10"
      "id" => ""
    ]
  ]
  "exchange_rate" => "USD"
  "payment_method" => "Cash"
  "creation_date" => "2019-02-11"
  "pay_date" => "2019-02-11"
  "delivery_date" => "2019-02-11"
  "note" => "aaa"
  "id" => "1"
]

I started working on a solution and got stuck, I could just delete all services connected to the Template I am changing and then create them again (but I don't think that is a very elegant solution). Current progress is:

$template = $this->company->getCompany()->templates()->where('id', $request->id)->update($request->except(['services', 'id']));
foreach ($request['services'] as $service) {
    Service::updateOrCreate(['id' => $service['id']], $service);
}

The problem is that it only updates existing services and does not create new ones nor those it delete one. I am stuck for some time and don't have a clue how to proceed, except the way I mentioned where I find all related services for Template, delete them and then add new ones for that Template (sth like this):

$template = $this->company->getCompany()->templates()->where('id', $request->id)->update($request->except(['services', 'id']));
Service::where('template_id', $request->id)->delete();
foreach ($request['services'] as $service) {
   Template::find($request->id)->services()->create($service);
}

Am sorry if someone posted something similar (tried to google this problem but found nothing). Very grateful for any kind of help!

Please sign in or create an account to participate in this conversation.