Php 在Laravel中从数据库存储和加载JSON的最佳方法

Php 在Laravel中从数据库存储和加载JSON的最佳方法,php,json,laravel,laravel-8,laravel-schema-builder,Php,Json,Laravel,Laravel 8,Laravel Schema Builder,我正在尝试将json存储到数据库中并将其加载回数据库 我试着储存 {name: "John", age: 31, city: "New York"} $paste->data = trim(Request::get('data','')); $paste->save(); 它存储正确。我检查了数据库,它显示正确 {姓名:“约翰”,年龄:31岁,城市:“纽约”} 我一直在看风景 "{name: \"John\&

我正在尝试将json存储到数据库中并将其加载回数据库

我试着储存

{name: "John", age: 31, city: "New York"}
$paste->data       = trim(Request::get('data',''));
$paste->save();
它存储正确。我检查了数据库,它显示正确

{姓名:“约翰”,年龄:31岁,城市:“纽约”}

我一直在看风景

"{name: \"John\", age: 31, city: \"New York\"}"
这是我的密码

public function store()
{

    $paste             = new Paste;
    $paste->uuid       = Str::uuid()->toString();
    $paste->data       = trim(Request::get('data',''));
    $paste->save();

    return Redirect::to('/paste/'.$paste->uuid)->with('success', 'Created');

}

public function show($uuid)
{
    $paste  = Paste::where('uuid',$uuid)->first();
    return response()->json($paste->data);
}
有什么提示吗

可在此复制


试试看 如果我这样做了

public function show($uuid)
{


    $paste  = Paste::where('uuid',$uuid)->first();
    return View::make('layouts.fe.pastes.show', get_defined_vars());

}
在我看来,我只有这一行

{!!$paste->data!!}
我得到的数据与我现在提交的数据相同

{name: "John", age: 31, city: "New York"}
但是浏览器检测到它是文本,而不是一个响应JSON,这违背了我试图做的事情的目的


试试看 结果

"{name: \"John\", age: 31, city: \"New York\"}"
"{name: \"John\", age: 31, city: \"New York\"}"

试试看 看法

结果

"{name: \"John\", age: 31, city: \"New York\"}"
"{name: \"John\", age: 31, city: \"New York\"}"

试试看 我认为问题在于存储。。。而不是加载和渲染

我试过了

return response()->json($paste);
我的JSON解析器检测到它

这是我以前储存的东西

{name: "John", age: 31, city: "New York"}
$paste->data       = trim(Request::get('data',''));
$paste->save();

试试看 对于那些怀疑我的数据/内容的人

我试过在Pastebin中粘贴同一行

它已经清理干净了,你可以看到下面


如果您想将数据存储为数据库上的json并将其还原,只需执行以下操作(我总是使用这种方式):

1-将数据添加到阵列:

$data["name"] = "John";
$data["age"] = 31;
$data["city"] = "New York";
2-对数组进行编码并将其添加到数据库(您可以将其存储为文本)

3-如果要添加嵌套的json数据,只需将数组设置为嵌套数组


4-当您恢复数据时,只需使用json\u decode对其进行解码

1-您的列需要为json类型

$table->json('data');
2-在您的模型中,您需要将列强制转换为数组

  protected $casts = ['data' => 'array'];
3-向控制器发送数据值必须是一个数组,以便可以对其使用数组Laravel验证:

[
  'data' => 'required|array',
  'data.*.name' => 'required'
   ....
]
4-当您存储数据时,它将被自动解析,当您检索数据列时,它将被转换为数组

数据库
  protected $casts = ['data' => 'array'];
在数据库迁移中添加:

$table->json('data'); // Recommended. Supported in MySQL since version 5.7.8

建议使用JSON列类型,因为它允许您对JSON数据执行SQL查询。看

模型:强制转换属性 下一个问题是,您需要能够将数据强制转换到PHP数组中

 $paste = Paste::first();
 dump($paste); // Returns a PHP array     

 $paste->data = ['some-data' => 20, 'score' => 500];
 $paste->save();
这是通过修改模型中的“强制转换”属性来完成的:

class Paste extends Model {
    protected $casts = [
        'data' => 'array'
    ];
}
有关更多信息,请参阅

现在,您可以将数据作为PHP数组保存到属性上,并为其分配一个PHP数组

 $paste = Paste::first();
 dump($paste); // Returns a PHP array     

 $paste->data = ['some-data' => 20, 'score' => 500];
 $paste->save();
在内部,当它保存数据时,会自动将其转换为JSON字符串,并以正确的格式保存在数据库中

存储方法 当输入为JSON时,它高度依赖于您希望如何传递数据

1。使用JSON内容类型发送表单数据(推荐)

我的建议是在帖子正文中以JSON的形式发送整个数据,如下所示:

Content-Type: application/json
Body:
{
   "data": {
      "name": "John",
      "age": 31,
      "city": "New York"
   },
   "someOtherField": "Hello!"
}
您的
store()
方法现在应该是(我还添加了验证代码):

2。使用表单参数发送表单数据

但是,如果您坚持通过查询参数或表单参数发送数据,请注意,这些参数只能发送字符串。因此,您需要向数据类型发送JSON字符串的编码版本,如下所示:

Form Params:
- data: '{"name": "John", "age": 31, "city": "New York"}'
- someOtherField: "Hello!"
存储方法现在如下所示:

    $this->validate($request, [
        'data' => ['required', 'json'], // I'm unsure if data is required
    ]);
    
    $data = json_decode($request->post('data'), true, JSON_THROW_ON_ERROR); // Needs to be decoded
    
    // validate $data is correct
    Validator::make($data, [
        'name' => ['required', 'string'],
        'age' => ['required', 'int'],
        'city' => ['required', 'string'],
    ])->validate();
    
    
    $paste = new Paste();
    $paste->uuid = Str::uuid()->toString();
    $paste->data = $data;
    $paste->save();

    return Redirect::to("/paste/{$paste->uuid}")
        ->with('success', 'Created');
显示方法 您的显示方法不需要更改:

public function show($uuid)
{
    $paste = Paste::where('uuid', $uuid)->first();
    return response()->json($paste->data);
}
  • 使用
    ->json()
    作为存储json数据的迁移方法()
  • 关于如何准备数据,请参阅“Array&JSON Casting”()

  • 我知道答案不像其他人那样以段落形式给出,但我喜欢把它简单明了。这是最好的解决方案吗?没有人能告诉你也不能证明这一点?这个方法行得通吗,没人能告诉你也不能证明这一点,但至少它能提高你的成功率。如果还有什么我可以帮忙的,请告诉我!祝你好运

    尝试使用
    returnresponse()->json(stripslashes($paste->data))或者,在你看来,试试这个:
    {json\u encode($paste->data,json\u UNESCAPED\u SLASHES)}
    两个都试试,斜线仍然在那里。试试
    {json\u decode($paste->data)}
    ,这应该行得通。控制器代码是什么样子的?我必须根据用户提供的数据来存储。。。请阅读我的帖子对不起,我这么说是因为你说问题出在存储上。默认情况下,来自请求的Json数据没有问题,但是如果问题仍然存在,您可以使用它填充响应数据,viewuser将提供Json文本。让我试试这个建议。我认为这种方法是处理Json的最佳方法。另外(假设OP使用的是MySQL数据库):较旧的MySQL服务器“我不支持JSON类型。所以MySQL@GordonFreeman对于旧版本,longText是解决方案,但我不确定Eleqont在这方面的表现case@PsyLogic雄辩的处理这件事很好。与旧项目没有任何问题
    protected$casts
    执行魔术,而不考虑实际的DB字段类型。我能想到的唯一缺点是,它不可能从数据库级别的JSON类型字段中获益(在JSON中搜索,等等)。感谢您的确认,但由于JSON方法添加到5.7+,因此它肯定不适用于搜索,因此您需要在ur DB中使用自定义函数或返回列值,然后在ur后端进行搜索(这是不推荐的)这一行,
    $data=json\u decode($request->post('data'));
    一直将我的数据输入json设置为null。你如何调用你的API。可能显示你的JavaScript或curl代码?如果你使用查询字符串,它将是
    $request->query('data'))
    。我已经更新了这一行。我犯了一个小错误,没有将true作为第二个参数。如果数据不是有效的JSON字符串,它也不会抛出错误。
    public function show($uuid)
    {
        $paste = Paste::where('uuid', $uuid)->first();
        return response()->json($paste->data);
    }