Я не могу проверить это сейчас, но я думаю, что это может быть связано с тем, как laravel вычисляет snake_case
и camel_case
.
В основном, когда вы запрашиваете поле типа $user->address_line_1
, laravelпреобразует поле в camelCase (AddressLine1
) и проверяет наличие пользовательских средств доступа, находит его и возвращает правильное измененное значение.
Однако, когда модель сериализуется в Json, она выполняет противоположную операцию: онапытается определить, какое поле необходимо изменить, глядя на методы доступа.Таким образом, он находит getAddressLine1Attribute
и преобразует его в snake_case .., получая address_line1
, неправильное поле.
Основная проблема здесь в том, что и address_line_1
, и address_line1
имеют одинаковое представление camelCase,поэтому невозможно надежно обратить преобразование в camelCase.
Хак, который вы можете попробовать, - определить аксессор как getAddressLine_1Attribute
, но он не будет работать при непосредственном доступе к полю ($user->address_line_1
)
Вы можете определить его для использования ранее определенных средств доступа, чтобы у вас не было повторения кода:
public function getAddressLine_1Attribute($value)
{
return $this->getAddressLine1Attribute($value);
}
public function getAddressLine1Attribute($value)
{
return empty($value) ? '' : decrypt($value);
}
РЕДАКТИРОВАТЬ: моя теория была подтверждена некоторыми тестами с использованием camel_case () и snake_case() вспомогательные функции