Почему Laravel хранит в базах данных два разных синтаксиса массивов и какой из них правильный?

Я работаю с Javascript и Ruby, и это меня сбивает с толку. Laravel может хранить в моей БД два разных синтаксиса массива в зависимости от того, как я обрабатываю сериализацию массива. В моем понимании collect() создает настоящий массив Laravel. Почему тогда он хранит сериализованный массив? Кроме того, остается ли {'key':'value'}syntax массивом, несмотря на то, что он не окружен квадратными скобками? Мне это кажется стандартным объектом или хешем, но если я попытаюсь выполнить на нем toArray(), он распознает, что это уже массив, и выдает ошибку. Что я недопонимаю и что здесь правильно?

Учитывая форму:

edit.blade:

<select class = "form-control m-bootstrap-select m_selectpicker" name = "temp">
     <option value = {{ json_encode(array("$key"=>"$cph"), JSON_FORCE_OBJECT) }}>
</select>

Следующие два синтаксиса контроллеров дают разные вставки в базу данных.

PageController.php:

$page->cph_default = collect($request->temp);
$page->save();

Laravel хранит в моей базе данных массив со следующим синтаксисом: ["{\" 11 \ ": \" 1100 \ "}"]

PageController.php

 $page->cph_default = json_decode($request->temp, true);
 $page->save();

Laravel хранит в моей базе данных массив со следующим синтаксисом: {"19": "1900"}

Данные, которые вы передаете из формы, - это json. В вашем первом примере вы создаете коллекцию из 1 строки (ваш json), а затем еще раз ее json_encoded, прежде чем она будет вставлена ​​в базу данных (поэтому она экранирована). Вам необходимо использовать json_decode до collect.

ljubadr 05.01.2019 00:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
120
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Неважно, что есть.

Сначала, если вы переносите массив в базу данных, конвертируйте в JSON FORMAT

Например, $variable = json_encode($request->controlname);

Это правильный способ хранить массив

В базу данных

Ответ принят как подходящий

Массив PHP с синтаксисом ['key' => 'value'] называется ассоциативным массивом и действует как хэш. Ассоциативный массив в кодировке JSON будет отображаться как объект в синтаксисе JSON. Примеры и дополнительная информация на PHP.net

Функция collect() в Laravel - это удобная оболочка для создания нового Коллекция. Коллекция на самом деле не столько «настоящий массив Laravel», сколько оболочка объекта с некоторыми удобными методами для изменения базового массива. Думайте об этом как о скалярном объекте.

В вашей форме при генерации значения параметра отправленное значение формы ($request->temp) будет строкой в ​​кодировке JSON. Буквально строка '{"19": "1900"}'.

Вызов collect($request->temp) не изменяет представленные данные. Он просто создает новую коллекцию (массив), содержащую один строковый элемент. Если бы вы позвонили toArray() в коллекцию, вы бы увидели что-то вроде этого:

[
    0 => '{"19": "1900"}'
]

Обратите внимание, что это ассоциативный массив нет, это числовой массив с индексом, отсчитываемым от нуля. Этот массив кодируется как массив JSON, а не как хеш-объект. Отсюда ваш первый результат.

Вызов json_decode($request->temp) превращает строку обратно в ассоциативный массив (хэш) перед ее сохранением через Eloquent. Затем Eloquent снова вызывает json_encode() внутри, превращая его обратно в тот же JSON, что и значение параметра вашей формы.

Если бы вы декодировали значение формы перед созданием коллекции, результирующее сохранение базы данных выглядело бы идентично. У вас будет удобство обертки Collection:

$page->cph_default = collect(json_decode($request->temp, true));
$page->save();

Если вы обрабатываете столбец как тип JSON, вы должны убедиться, что данные, переданные в Eloquent, НЕ уже закодированы, иначе вы получите двойное кодирование, испытанное в вашем первом примере.

Большое спасибо за объяснение. Вы действительно сделали все возможное с этим ответом, и это было очень полезно.

tshm001 25.01.2019 01:09

Другие вопросы по теме