在刀片文件中使用数组的问题 - Laravel 5.6

时间:2018-04-05 21:37:15

标签: php json laravel-5 laravel-blade stringify

使用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" }

在$ param上使用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 [&#39; x&#39;],并返回非法字符串偏移量错误。我不确定为什么会这样,因为当我手动制作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循环来迭代它?

2 个答案:

答案 0 :(得分:1)

修改 基于新信息,您所说的部分问题是您将数据存储为一维数组,而事实上您应该将数据存储为二维数组。

考虑到这一点,您的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

最后,为了简化从Eloquent模型中保存和检索JSON值,您可能需要考虑使用强制转换。 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 :(得分:0)

问题不在于检索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循环。