Итак, у меня есть проект, основанный на Laravel 5.2 / PHP 7.0.6 и использующий Transformers для обработки ответов API. В МНОГИХ местах нашего кода мы используем новые операторы php 7 coalescing (??). Однако с момента нашего обновления до php 7.0.6 мы видим много следующего:
Код: 'vip_id' => $beneficiaryQdro->beneficiary->vip_id ?? ''
ожидаемый результат: 11583 (vip-идентификатор отношений бенефициара)
Фактический результат: »
Я попытался запустить это: dd($beneficiaryQdro->beneficiary->vip_id)
и я получаю верный vip_id. Однако, когда я добавляю оператор объединения, он снова возвращает пустую строку. Это работало раньше. Кто-нибудь еще видел, как это случилось с новым релизом php?
ОбновитьЯ исправил это, стремясь загрузить отношения. Что-то в операторе слияния не нравится иметь дело с отношениями, где он заполняет информацию на лету. Я не уверен, чья это проблема. До 7.0.6 операторы объединения работали с отношениями, которые загружались не очень хорошо, но это обновление каким-то образом сломало его.
Выполнение:
$beneficiaryQdro->beneficiary->vip_id ?? ''
это то же самое, что делать:
isset($beneficiaryQdro->beneficiary->vip_id) ? $beneficiaryQdro->beneficiary->vip_id : ''
Так что если beneficiary
отношения загружаются, это всегда будет ложным при выполнении isset и в результате будет ».
В PHP 7.0.6 исправлено 2 ошибки, которые выглядят так, как будто они связаны с вашим поведением и вашей проблемой:
Оператор объединения в классы с переопределенным методом __get ()
https://bugs.php.net/bug.php?id=71359
Нулевой оператор объединения и ArrayAccess
https://bugs.php.net/bug.php?id=71731
Так что это может быть проблемой с тем, как Eloquent обрабатывает его своими волшебными методами. У меня нет установки под PHP 7, чтобы подтвердить это, хотя.
Похоже, что это также спросили здесь: https://laracasts.com/discuss/channels/eloquent/eloquent-relation-isset-always-return-false
Похоже, он не должен был работать до 7.0.6.
Подводя итог, isset не загружает отношения.
Других решений пока нет …