Тип Laravel для вложенного массива - PullRequest
0 голосов
/ 21 октября 2019

Как создать определение приведения для модели 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 для программного доступа к ее элементам, что не идеально.

Этот пример кажется достаточно простым, но неудобным в масштабе. Я пытаюсь найти способ создать приведение, которое кодирует / декодирует ВСЕ вложенные уровни массива, а не только первый уровень.

1 Ответ

0 голосов
/ 21 октября 2019

Оказывается, моя проблема была в том, что я использовал

$tableResults = DB::table('table')->where()....

вместо

$tableResults = new Table();
$tableResults = $tableResults->where()....

. По понятным причинам приведение типов Eloquent работает только тогда, когда вы действительно используетеКрасноречивая модель. Это не имеет никакого отношения, когда вы взаимодействуете с БД напрямую.

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