为什么Laravel在数据库中存储两种不同的数组语法,哪一种是正确的?

时间:2019-01-04 22:40:57

标签: php arrays laravel laravel-5 eloquent

我来自Javascript和Ruby背景,这让我感到困惑。 Laravel可以根据我处理数组序列化的方式在数据库中存储两种不同的数组语法。以我的理解,collect()创建了一个真正的Laravel数组。那么为什么要存储序列化数组呢?此外,尽管{'key':'value'}语法周围没有方括号,它仍然是数组吗?在我看来,它看起来像是标准对象或哈希,但是如果我尝试在其上进行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”}

2 个答案:

答案 0 :(得分:4)

语法为['key' => 'value']的PHP数组称为关联数组,其作用类似于哈希。 JSON编码的关联数组将显示为JSON语法中的对象。 Examples and more info on PHP.net

Laravel的collect()函数是用于创建新Collection的便捷包装器。 Collection实际上不是一个“真正的Laravel数组”,它是一个对象包装程序,带有一些方便的方法来修改基础数组。可以将其视为标量对象。

在您的表单中,生成选项值时,提交的表单值($request->temp)将是JSON编码的字符串。字面上是字符串'{"19": "1900"}'

调用collect($request->temp)不会对该提交的数据进行任何修改。它只是在创建一个包含单个字符串项的新Collection(数组)。如果您要调用集合中的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的数据尚未编码,否则您将在第一个示例中获得双重编码。

答案 1 :(得分:-1)

没关系什么是。

首先,如果要将数组存储到数据库中,请转换为JSON FORMAT

例如 $variable = json_encode($request->controlname);

这是存储数组的正确方法

进入数据库