PHP / Laravel - обновить значения объекта JSON - PullRequest
0 голосов
/ 06 сентября 2018

В 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": "my_email@email.com"
            +"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"
                ]
            }
            }

Ответы [ 2 ]

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

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

0 голосов
/ 06 сентября 2018

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

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

Разница красноречивых push () и save ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...