Otrzymuję błąd 500 (pośrednia modyfikacja przeciążonej właściwości App \ Example :: $ exampleName nie ma wpływu) na moją metodę aktualizacji i nie wiem, dlaczego.

public function update(Request $request, Example $example)
{
    $data = $request->validate([
        'account_name' => 'required|string',
        'name'=> 'nullable|string',
        'name_type' =>'nullable|integer',
    ]);
    $example->account_name = $data['account_name'];
    $example->exampleName->name = $data['name'];
    $example->exampleName->name_type = $data['name_type'];

    $example->push(); 
    return response($example,200);
}
1
Beusebiu 28 listopad 2019, 16:53

1 odpowiedź

Najlepsza odpowiedź

Jak stwierdzono w komentarzach, $example->exampleName może być null, więc dostęp / modyfikowanie właściwości lub wywoływanie metod jest niedozwolone. Muszę przemyśleć tutaj logikę. Na przykład:

$exampleName = $example->exampleName;
if(!$exampleName){
  $exampleName = new ExampleName();
  $exampleName->example_id = $example->id;
}
$exampleName->name = $data['name'];
$exampleName->name_type = $data['name_type'];

$exampleName->save();

W tym przykładzie najpierw sprawdza istnienie skojarzonego rekordu, a jeśli zostanie znaleziony, ignoruje inicjalizację. Jeśli nie zostanie znaleziony, inicjalizuje go i łączy za pomocą example_id (lub w inny sposób, w jaki jest wykonywany). Następnie po prostu wypełnia kolumny i wykonuje operację save(). Twój pełny kod wyglądałby tak:

public function update(Request $request, Example $example){
  $data = $request->validate([
    'account_name' => 'required|string',
    'name'=> 'nullable|string',
    'name_type' =>'nullable|integer',
  ]);

  $example->account_name = $data['account_name'];
  $example->save();

  $exampleName = $example->exampleName;
  if(!$exampleName){
    $exampleName = new ExampleName();
    $exampleName->example_id = $example->id; // Or however you link them
  }
  $exampleName->name = $data['name'];
  $exampleName->name_type = $data['name_type'];

  $exampleName->save();

  $example->load('exampleName');

  return response($example,200);
}

Ponieważ $example->exampleName może nadal znajdować się null przed instrukcją return, wywoływane jest proste $example->load(), aby upewnić się, że zostanie również zwrócone w odpowiedzi JSON.

2
Tim Lewis 28 listopad 2019, 15:58