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

问题描述 投票:0回答:2

我来自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”}

php arrays laravel laravel-5 eloquent
2个回答
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数组,而不是哈希对象。因此你的第一个结果。

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

如果在创建集合之前解码表单值,则生成的数据库保存看起来相同。你只是拥有Collection包装器的便利:

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

如果您将列视为JSON类型,则应确保传递给Eloquent的数据尚未编码,或者您将在第一个示例中获得经历的双重编码。


-1
投票

无所谓是什么。

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

例如JSON FORMAT

这是存储数组的正确方法

进入数据库

© www.soinside.com 2019 - 2024. All rights reserved.