Косвенное изменение перегруженного свойства App \ Dossier :: $ program не действует

Добрый день, у меня есть этот код на бэкэнде (пытаюсь обновить это значение в MONGO) http://prntscr.com/j03gh4

$dossier=Dossier::where('_id',(int)$request->input('dossier_id'))->first();
//var_dump($request->input('value'));
$dossier->program[$request->input('program')]['cities']
 [$request->input('city')]['services']
 [$request->input('service')][$request->input('name')]=$request->input('value');
$dossier->save();

Но я получаю это исключение http://prntscr.com/j03h0s

Indirect modification of overloaded property App\Dossier::$program has no effect

Что мне делать, чтобы исправить эту ситуацию?

Вопросы, требующие помощи по отладке ("почему этот код не работает?"), должны включать желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для ее воспроизведения в самом вопросе. Вопросы без четкой постановки проблемы не будут полезны другим читателям. См .: Как создать минимальный, полный и проверяемый пример.

apokryfos 03.04.2018 09:10

Извините, но если вы знаете, почему присутствует это исключение, пожалуйста, объясните. Я не понимаю Вот почему я спрашиваю. И я просто прошу помощи. Почему ты такой чопорный и самодовольный?

David 03.04.2018 09:13

Вам слишком сложно включить сообщение об исключении в вопрос? Вам действительно нужно направить вас на сторонние сервисы? А также, скажем, через 5 лет, когда кто-то столкнется с такой же проблемой и найдет этот вопрос, действительно ли вы доверяете этой сторонней службе, чтобы сохранить ваш снимок экрана?

apokryfos 03.04.2018 09:14

Хорошо, я публикую сообщение об исключении. Просто экран дает полную картину :)

David 03.04.2018 09:18

Боже, благослови StackOverflow :)

David 03.04.2018 09:19

Добавление сообщения об исключении гарантирует, что если кто-то наберет в Google «модификация mongo indicrect не имеет эффекта», этот вопрос появится, потому что он будет проиндексирован.

apokryfos 03.04.2018 09:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
7
6
7 879
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что вызов $dossier->program на самом деле не обращается к свойству напрямую в моделях типа Eloquent, а вызывает метод __get.

Этот метод get не возвращает ссылку на свойство. Что вам нужно сделать, так это взять исходное свойство, изменить его и затем вернуть обратно:

$dossier=Dossier::where('_id',(int)$request->input('dossier_id'))->first();
$originalProgram = $dossier->program;
$originalProgram[$request->input('program')]['cities'][$request->input('city')]['services'][$request->input('service')][$request->input('name')]=$request->input('value');
$dossier->program = $originalProgram;
$dossier->save();

Большое спасибо, господин Апокрифос :)

David 03.04.2018 09:25

Отличное объяснение! Большое спасибо!

Hasnat Babur 22.01.2020 09:39

Другие вопросы по теме