Ошибка при попытке получить свойство необъекта в Laravel 5.6 - PullRequest
0 голосов
/ 07 ноября 2018

, поэтому я пытаюсь перебрать массив объектов для обновления определенных значений в моей базе данных значениями из объекта

Когда я запускаю этот цикл в моем контроллере

foreach($statuses as $status){
            $workflow->statuses()->where('id', $status->id)->update([
                'status' =>  $status->status
            ]);
        };

Это дает мне ошибку trying to get property of non-object

Когда я делаю ответный ответ ($ request-> statuses), это структура данных, которую я вижу в консоли enter image description here

вот полный контроллер

public function workflowStatuses(Request $request, Workflow $workflow)
    {

        // validate form data
        $data = $request->validate([
            'workflow' => 'required|string',
        ]);

            // validate form data
        $oldStatuses = $request->validate([
            'statuses' => 'required|array'
        ]);

        // validate form data
        $newStatuses = $request->validate([
            'newStatuses' => 'required|array',
        ]);


        $workflow->update($data);

        $statuses = $oldStatuses;

        foreach($statuses as $status){
            $workflow->statuses()->where('id', $status['id'])->update([
                'status' =>  $status->status
            ]);
        };

        $workflow->statuses()->saveMany($newStatuses);

        return response($workflow, 200);

    }

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Можно считать возвращаемое значение $request->validate() массивом всех входных запросов, отфильтрованных для включения только проверяемых данных. Если эти проверенные данные содержат массивы, у вас будет многомерный массив.

Здесь $oldStatuses будет массивом, который содержит ключ с именем statuses, который содержит фактический массив, который вы ищете.

$oldStatuses = $request->validate([
   'statuses' => 'required|array'
]);


// $statuses should get 'statuses' out of this validated array
$statuses = $oldStatuses['statuses'];

Вместо этого вы можете захотеть убрать это, а не вызывать проверку три раза. Обычно лучше запускать все правила валидации в одном вызове validate (), если только у вас нет веских причин для их логического разделения.

$validated = $request->validate([
   'workflow' => 'required|string',
   'statuses' => 'required|array',
   'newStatuses' => 'required|array',
]);

$statuses = $validated['statuses'];
0 голосов
/ 07 ноября 2018

Попробуйте:

foreach($statuses as $status){
   $workflow->statuses()->where('id', $status['id'])->update([
   'status' =>  $status['status'] //$status['status'] should also be accessed by key 
   ]);
};
...