PHP / Laravel - обновить значения объекта JSON

В Laravel PHP у меня есть объект, который требует обновления некоторых параметров. Объект обновлен, и я могу вернуть или dd () правильные значения. Но когда я -> save (), значения как будто не изменились. Метод -> save работает нормально, но то, как я обновляю значения объекта, явно как-то неправильно ...

Итак, используя следующий код, я просматриваю массив параметров для обновления и создания обновленного объекта (упрощенный пример):

      $account = Account::find('account_id');
      // ^returns something like (object)['user'=>['name'=>'jeff','age'=>'20']];

      $to_update = ['user.name':'john', 'user.age':'50'];

      // the following function converts exploded arrays of key names to php objects
      // ie user.name:"John" becomes user->name = john
      function get($path, $object, $value) {
        $temp = &$object;
        foreach($path as $var) {
            $temp =& $temp->$var;
        }
        $temp = $value;
      }

      foreach($to_update as $keys => $value){

        $key = explode(".", $keys);
        get($key, $account, $value);
      }

      // $account->save();

      return $account;

Это возвращает красивый обновленный объект, например:

+"user": +"name":"john" +"age":"50"

ОДНАКО, если я сохраню этот объект, он не сохранит обновленные значения, а только старые значения. Итак, изменив последние две строки:

      $account->save();

      return $account;

приводит к

+"user": +"name":"jeff" +"age":"20" // these are the old values

Итак, мой вопрос - почему return $account выдает правильный обновленный объект, а $account->save(); return $account возвращается к исходным значениям?

К вашему сведению: следующий код работает (но слишком прост для моих целей):

  $account = Account::find('account_id');
  // ^returns something like (object)['user'=>['name'=>'jeff','age'=>'20']];

  $account->user->name = "jim";
  $account->user->age = "100";

  $account->save();

  return $account;

+"user": +"name":"jim" +"age":"100"

Полный вывод dd $ account ПЕРЕД сохранением выглядит следующим образом (включая мои обновленные значения):

        Account {#642
            +"id": "1234567890"
            +"object": "account"
            +"business_name": "my-business"
            +"business_primary_color": "#c2185b"
            +"business_url": "http://url.com"
            +"charges_enabled": true
            +"country": "GB"
            +"created": 1534491122
            +"debit_negative_balances": false
            +"decline_charge_on": StripeObject {#644
                +"avs_failure": false
                +"cvc_failure": false
            }
            +"default_currency": "gbp"
            +"details_submitted": false
            +"display_name": "display_name"
            +"email": "[email protected]"
            +"external_accounts": Collection {#643
                +"object": "list"
                +"data": []
                +"has_more": false
                +"total_count": 0
                +"url": "external_accounts_url"
            }
            +"legal_entity": StripeObject {#649
                +"additional_owners": []
                +"address": StripeObject {#655
                +"city": null
                +"country": "GB"
                +"line1": null
                +"line2": null
                +"postal_code": null
                +"state": null
                }
                +"business_name": null
                +"business_tax_id_provided": false
                +"dob": StripeObject {#656
                +"day": "01"
                +"month": "01"
                +"year": null
                }
                +"first_name": "john"
                +"last_name": "doe"
                +"personal_address": StripeObject {#659
                +"city": null
                +"country": "GB"
                +"line1": null
                +"line2": null
                +"postal_code": null
                +"state": null
                }
                +"type": "company"
                +"verification": StripeObject {#662
                +"details": null
                +"details_code": null
                +"document": null
                +"document_back": null
                +"status": "unverified"
                }
            }
            +"metadata": StripeObject {#652}
            +"payout_schedule": StripeObject {#665
                +"delay_days": 7
                +"interval": "daily"
            }
            +"payout_statement_descriptor": null
            +"payouts_enabled": false
            +"product_description": null
            +"statement_descriptor": "MY BUSINESS"
            +"support_email": null
            +"support_phone": null
            +"timezone": "Etc/UTC"
            +"tos_acceptance": StripeObject {#670
                +"date": 1535741539
                +"ip": "255.255.255.255"
                +"user_agent": null
            }
            +"type": "custom"
            +"verification": StripeObject {#673
                +"disabled_reason": null
                +"due_by": null
                +"fields_needed": array:6 [
                0 => "external_account"
                1 => "legal_entity.additional_owners"
                2 => "legal_entity.dob.day"
                3 => "legal_entity.dob.month"
                4 => "legal_entity.dob.year"
                5 => "legal_entity.last_name"
                ]
            }
            }

Можете ли вы опубликовать свой полный дд из $ аккаунта прямо перед сохранением? Вероятно, вы манипулируете неправильными атрибутами. Тем не менее я не совсем уверен, почему вы выбрали такой довольно сложный способ обновления пользователя учетной записи. Поскольку учетная запись, похоже, имеет только 1 пользователя, вы можете просто запросить пользователя в самом первом экземпляре, а затем обновить его непосредственно из параметров запроса, таких как $user->update($request->only(['name', 'age']).

Frnak 06.09.2018 14:14

проверьте, заполняются ли эти поля для модели

ineersa 06.09.2018 14:18

Аккаунт :: создать ([$ account]); может работать, если вы не охраняли все поля в модели?

Polaris 06.09.2018 14:35

@FrankProvost - первое желтое поле показывает dd объекта до сохранения, второе желтое поле показывает dd после сохранения. Он возвращается к исходным значениям! Я упростил пример, но основные моменты заключаются в следующем: я должен установить значения из предоставленного простого JSON ($ to_update), так как это суть упражнения, и я могу сохранить только с помощью -> save () в качестве этих данных из API. Мне было интересно, есть ли что-то не так в строке «get ($ key, $ account, $ value);» ...?

Leon 06.09.2018 14:39

@ineersa модель обновляет те же самые поля, если я делаю это так, как показано в третьем примере кода, поэтому незащищенный / заполняемый, похоже, не проблема

Leon 06.09.2018 14:42

Это не полная версия красноречивого экземпляра модели. Dd выведет все поля + методы модели (например, laraveldaily.com/echoing-dd-vs-var_dump-vs-print_r)

Frnak 06.09.2018 14:44

@FrankProvost Я добавил обновленный вывод, показывающий тип объекта

Leon 06.09.2018 14:53

да ладно - я просто понимаю: вы сохраняете учетную запись, даже если вы вносите изменения в пользователя. Вероятно, вам нужно будет использовать push вместо сохранения - см. Этот stackoverflow.com/questions/17035682/…

Frnak 06.09.2018 14:56
Стоит ли изучать 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 и хотите разрабатывать...
0
8
2 454
2

Ответы 2

Поскольку вы обновляете внутренние объекты, но вызываете save для внешнего объекта, он обновляет только внешний объект, а затем перезагружает текущие отношения, которые не были обновлены.

Поэтому используйте $account->push() вместо этого или просто $account->user->save(), чтобы сохранить правильный.

Красноречивая разница между push () и save ()

Звучит примерно правильно! НО я не могу использовать push () напрямую [вызов неопределенного метода push ()]. Интересно, есть ли способ «применить» мои изменения и ЗАТЕМ сохранить?

Leon 06.09.2018 15:00

$ аккаунт-> пользователь-> сохранить (); также приводит к [вызову неопределенного метода save ()]

Leon 06.09.2018 15:02

если $ accoun-> user-> save () приводит к неопределенному методу, тогда пользователь не возвращает красноречивую модель - каков результат dd ($ account-> user)

Frnak 06.09.2018 15:10

Это StripeObject (JSON): StripeObject {# 649 + "адрес": StripeObject {# 655 + "city": null + "country": "GB" и т. д.

Leon 06.09.2018 15:13

вы используете кассир laravel? Я не знал, что мы говорим об интеграции полосы, когда вы действительно хотите обновить информацию на стороне полосы.

Frnak 06.09.2018 15:17

да ... извините, я пытался упростить. Я уверен, что вы что-то понимаете в том, что я обновляю внутренние сущности и сохраняю внешнюю сущность ...

Leon 06.09.2018 15:25

Вы вызвали метод сохранения для объекта учетной записи вместо объекта пользователя в учетной записи, чтобы использовать $ аккаунт-> пользователь-> сохранить (); или используйте его, если ваша цель - обновить те же данные пользователя, что и $ account-> user-> update (['name' => 'jim', 'age' => '100']);

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