Как создать определение приведения для модели Eloquent, которая позволяет автоматически обрабатывать кодирование / декодирование вложенных массивов?
Насколько я могу судить, приведение 'array'
кодирует и декодирует только первый уровень массива. Если у вас есть вложенный массив, вложенные уровни будут возвращаться только как строки, а не как массивы.
Laravel позволяет вам приводить типы данных для использования с Eloquent Models, чтобы значения можно было передавать в и изБД без необходимости постоянно использовать json_decode, json_encode и т. Д.
Здесь их документы обсуждают приведение типов PHP-массивов <-> MySQL JSON:
https://laravel.com/docs/master/eloquent-mutators#array-and-json-casting
проблема в том, что если у вас есть вложенный массив PHP и вы хотите преобразовать его в / из MySQL, преобразование массива Laravel работает только на первом уровне.
Массив или объект с несколькими вложенными уровнями будут иметь свои вложенные уровнихранятся и извлекаются как строки, а не как массивы.
Например:
Если это свойство в вашей модели:
protected $casts = [
'nestedArray' => 'array'
]
И затем вы пытаетесь сохранить этоВложенный массив в вашу БД:
$nestedArray = [
'sample1key' => 'sample1data',
'sample2key' => ['nested2key' => 'nested2data']
]
Если вы используете вышеупомянутый массив PHP и сохраните его в БД MySQL как JSON, а затем получите его вместо исходного вложенного массива yВы получите следующее:
$nestedArray = [
'sample1key' => 'sample1data',
'sample2key' => "['nested2key' => 'nested2data']"
]
Обратите внимание на новые двойные кавычки, которые означают, что это строка, и вам придется использовать json_decode для sample2key
для программного доступа к ее элементам, что не идеально.
Этот пример кажется достаточно простым, но неудобным в масштабе. Я пытаюсь найти способ создать приведение, которое кодирует / декодирует ВСЕ вложенные уровни массива, а не только первый уровень.