В 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"
]
}
}
проверьте, заполняются ли эти поля для модели
Аккаунт :: создать ([$ account]); может работать, если вы не охраняли все поля в модели?
@FrankProvost - первое желтое поле показывает dd объекта до сохранения, второе желтое поле показывает dd после сохранения. Он возвращается к исходным значениям! Я упростил пример, но основные моменты заключаются в следующем: я должен установить значения из предоставленного простого JSON ($ to_update), так как это суть упражнения, и я могу сохранить только с помощью -> save () в качестве этих данных из API. Мне было интересно, есть ли что-то не так в строке «get ($ key, $ account, $ value);» ...?
@ineersa модель обновляет те же самые поля, если я делаю это так, как показано в третьем примере кода, поэтому незащищенный / заполняемый, похоже, не проблема
Это не полная версия красноречивого экземпляра модели. Dd выведет все поля + методы модели (например, laraveldaily.com/echoing-dd-vs-var_dump-vs-print_r)
@FrankProvost Я добавил обновленный вывод, показывающий тип объекта
да ладно - я просто понимаю: вы сохраняете учетную запись, даже если вы вносите изменения в пользователя. Вероятно, вам нужно будет использовать push вместо сохранения - см. Этот stackoverflow.com/questions/17035682/…






Поскольку вы обновляете внутренние объекты, но вызываете save для внешнего объекта, он обновляет только внешний объект, а затем перезагружает текущие отношения, которые не были обновлены.
Поэтому используйте $account->push() вместо этого или просто $account->user->save(), чтобы сохранить правильный.
Красноречивая разница между push () и save ()
Звучит примерно правильно! НО я не могу использовать push () напрямую [вызов неопределенного метода push ()]. Интересно, есть ли способ «применить» мои изменения и ЗАТЕМ сохранить?
$ аккаунт-> пользователь-> сохранить (); также приводит к [вызову неопределенного метода save ()]
если $ accoun-> user-> save () приводит к неопределенному методу, тогда пользователь не возвращает красноречивую модель - каков результат dd ($ account-> user)
Это StripeObject (JSON): StripeObject {# 649 + "адрес": StripeObject {# 655 + "city": null + "country": "GB" и т. д.
вы используете кассир laravel? Я не знал, что мы говорим об интеграции полосы, когда вы действительно хотите обновить информацию на стороне полосы.
да ... извините, я пытался упростить. Я уверен, что вы что-то понимаете в том, что я обновляю внутренние сущности и сохраняю внешнюю сущность ...
Вы вызвали метод сохранения для объекта учетной записи вместо объекта пользователя в учетной записи, чтобы использовать $ аккаунт-> пользователь-> сохранить (); или используйте его, если ваша цель - обновить те же данные пользователя, что и $ account-> user-> update (['name' => 'jim', 'age' => '100']);
Можете ли вы опубликовать свой полный дд из $ аккаунта прямо перед сохранением? Вероятно, вы манипулируете неправильными атрибутами. Тем не менее я не совсем уверен, почему вы выбрали такой довольно сложный способ обновления пользователя учетной записи. Поскольку учетная запись, похоже, имеет только 1 пользователя, вы можете просто запросить пользователя в самом первом экземпляре, а затем обновить его непосредственно из параметров запроса, таких как
$user->update($request->only(['name', 'age']).