【问题标题】:Why does Laravel store two different array syntaxes in databases and which one is correct?为什么 Laravel 会在数据库中存储两种不同的数组语法,哪一种是正确的?
【发布时间】:2019-05-31 12:13:21
【问题描述】:

我来自 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(这就是它被转义的原因)。你需要在collect之前使用json_decode

标签: php arrays laravel laravel-5 eloquent


【解决方案1】:

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

Laravel 的 collect() 函数是一个方便的包装器,用于创建新的 Collection。 Collection 并不是真正的“真正的 Laravel 数组”,它是一个对象包装器,具有一些用于修改底层数组的便捷方法。把它想象成一个标量对象。

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

调用collect($request-&gt;temp) 不会修改提交的数据。它只是创建一个包含单个字符串项的新集合(数组)。如果你在集合上调用toArray(),你会看到如下内容:

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

请注意,这不是关联数组,它是具有从零开始的索引的数值数组。该数组被编码为 JSON 数组,而不是哈希对象。因此你的第一个结果。

调用json_decode($request-&gt;temp) 会将字符串转换回关联数组(哈希),然后再通过 Eloquent 保存它。然后,Eloquent 在内部再次调用 json_encode(),将其转换回与表单选项值相同的 JSON。

如果您在创建集合之前对表单值进行解码,则生成的数据库保存看起来会相同。您只需使用 Collection 包装器即可:

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

如果您将列视为 JSON 类型,则应确保传递给 Eloquent 的数据尚未编码,否则您将在第一个示例中体验到双重编码。

【讨论】:

  • 非常感谢您的解释。你真的超越了这个答案,它非常有帮助。
【解决方案2】:

不管是什么。

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

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

这是存储数组的正确方法

进入数据库

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多