Проблемы с использованием массива в блейд-файле — Laravel 5.6

У меня возникают проблемы при использовании цикла foreach для итерации моего массива. Когда я это делаю, кажется, что я удаляю имена элементов и не могу ссылаться на массив, как я ожидал.

Вот JSON, который мы берем из базы данных:

{"i": "", "ca": "", "gh": "5", "kh": "6", "mg": "", "ph": "4", "sg": "", "sr": "", "nh3": "1", "no2": "2", "no3": "3", "po4": "", "tds": "7", "date": "2018-04-05"}

Затем я декодирую его в моем контроллере:

$params = json_decode($aquarium->parameters, true);

Передайте его на просмотр:

return view('pages.aquarium.view', compact('aquarium', 'params', 'stocks', 'settings'));

И используйте его в цикле foreach:

@if(is_array($params))
@foreach($params as $param)
<tr>
<td>{{ $params['date'] }}</td>
<td class="ammonia-col">{{ $param['nh3'] }}</td>
<td class="nitrite-col">{{ $param['no2'] }}</td>
...
</tr>
@endforeach
@endif

Тем не менее, когда я var_dump оригинальные $ params, я получаю это:

array(14) { ["i"]=> string(0) "" ["ca"]=> string(0) "" ["gh"]=> string(1) "5" ["kh"]=> string(1) "6" ["mg"]=> string(0) "" ["ph"]=> string(1) "4" ["sg"]=> string(0) "" ["sr"]=> string(0) "" ["nh3"]=> string(1) "1" ["no2"]=> string(1) "2" ["no3"]=> string(1) "3" ["po4"]=> string(0) "" ["tds"]=> string(1) "7" ["date"]=> string(10) "2018-04-05" }

Использование var_dump в параметре $ дает следующее:

string(0) "" string(0) "" string(1) "5" string(1) "6" string(0) "" string(1) "4" string(0) "" string(0) "" string(1) "1" string(1) "2" string(1) "3" string(0) "" string(1) "7" string(10) "2018-04-05"

Это лишает меня возможности ссылаться на него как $ param [‘x’] и возвращает ошибку недопустимого смещения строки. Я не уверен, почему это так, поскольку это работало, когда я вручную создавал JSON. Теперь, когда я создаю объект и затем использую JSON.stringify, он ломается. Я знаю, что в настоящее время существует только один набор, но в конечном итоге в JSON будет много наборов данных, поэтому цикл foreach потребуется для их итерации.

Для справки, мой старый способ изготовления JSON вручную:

var params = '[{ "date":"'+date+'", "nh3":"'+ammonia+'", "no2":"'+nitrite+'", "no3":"'+nitrate+
'", "ph":"'+ph+'", "gh":"'+gh+'", "kh":"'+kh+'", "tds":"'+tds+'", "sg":"'+sg+'", "po4":"'+
phosphate+'", "ca":"'+calcium+'", "mg":"'+magnesium+'", "i":"'+iodine+'", "sr":"'+strontium+'" }]';

И новый способ:

var params = {
date: date,
nh3: ammonia,
no2: nitrite,
no3: nitrate,
ph: ph,
gh: gh,
kh: kh,
tds: tds,
sg: sg,
po4: phosphate,
ca: calcium,
mg: magnesium,
i: iodine,
sr: strontium
};

В запросе AJAX я затем вызываю JSON.stringify (params), и он надлежащим образом сохраняется как действительный JSON в базе данных.

Глядя на это, я думаю, что я понял проблему. Это сохраняет JSON без квадратных скобок. Я не уверен в правильной терминологии или в том, как добавить ее, не создавая вручную JSON. Хотя я могу вернуться к этому пути, это казалось неправильным, и с этим было трудно работать, если мне нужно было изменить данные.

Как мне соответствующим образом привести JSON в мою базу данных с квадратными скобками, чтобы сформировать коллекцию объектов JSON, чтобы я мог правильно использовать цикл foreach для его итерации?

0

Решение

редактировать
Основываясь на новой информации, часть проблемы, как вы говорите, заключается в том, что вы хранили данные как одномерный массив, тогда как на самом деле вы должны были хранить их как двумерный массив.

Имея это в виду, ваш JSON-декодированный массив будет выглядеть так:

$params = [
[
'i'  => '',
'ca' => '',
'gh' => '5',
'kh' => '6',
// ...
],
];

Таким образом, когда вы перебираете свой массив params, вам нужно сделать следующее:

@if (is_array($params))
@foreach ($params as $param)
<tr>
<td>{{ $param['date'] }}</td>
<td class="ammonia-col">{{ $param['nh3'] }}</td>
<td class="nitrite-col">{{ $param['no2'] }}</td>
...
</tr>
@endforeach
@endif

Наконец, чтобы упростить сохранение и извлечение JSON значения из модели Eloquent, вы можете рассмотреть возможность использования приведения.
https://laravel.com/docs/5.6/eloquent-mutators#array-and-json-casting

class Aquarium extends Model
{
// ...

protected $casts = [
'parameters' => 'array',
];

// ...
}

$aquarium = Aquarium::find(1);

$aquarium->parameters = [
[
// ...
]
];

$aquarium->save();
1

Другие решения

Проблема была не в поиске JSON, а в том, как я его хранил. Я сохранил это так:

var params = {
date: date,
nh3: ammonia,
no2: nitrite,
no3: nitrate,
ph: ph,
gh: gh,
kh: kh,
tds: tds,
sg: sg,
po4: phosphate,
ca: calcium,
mg: magnesium,
i: iodine,
sr: strontium
};

Когда мне нужно было хранить его как:

var params = [{
date: date,
nh3: ammonia,
no2: nitrite,
no3: nitrate,
ph: ph,
gh: gh,
kh: kh,
tds: tds,
sg: sg,
po4: phosphate,
ca: calcium,
mg: magnesium,
i: iodine,
sr: strontium
}];

Поскольку в одном поле базы данных будет храниться несколько объектов JSON, удаление цикла foreach невозможно.

0

По вопросам рекламы [email protected]