Я работаю с 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 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, НЕ уже закодированы, иначе вы получите двойное кодирование, испытанное в вашем первом примере.
Большое спасибо за объяснение. Вы действительно сделали все возможное с этим ответом, и это было очень полезно.
Данные, которые вы передаете из формы, - это json. В вашем первом примере вы создаете коллекцию из 1 строки (ваш json), а затем еще раз ее json_encoded, прежде чем она будет вставлена в базу данных (поэтому она экранирована). Вам необходимо использовать
json_decodeдоcollect.