如何更新firebase中现有的嵌套数组以通过curl添加新项目?[关闭]

How to update an existing nested array in firebase to add a new item through curl? [closed]

提问人:M G 提问时间:11/8/2023 最后编辑:Frank van PuffelenM G 更新时间:11/8/2023 访问量:83

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

7天前关闭。

enter image description here

上面显示的是我的 firebase 实时数据库数据结构。目前,数组下只有一组名为 的数据。我的要求是添加更多数据集(可能带有索引 120,121 等),例如数组。下面的 laravel 代码替换了整个数组,同时添加了新的数据集。我想将数组中的所有项目保留为所有其他数组,并添加新的数据集作为 firebase 中数组的下一个项目。如何实现这一点?A感谢您的帮助。msgs119119msgsmsgsmsgs

$url = env('FIREBASE_DATABASE_URL') . 'messages.json';
 // $postdat = array();

$postdat[$request->chat_id]["user_id_" . $user_id]['chats']['chat_id_' . $request->chat_id]['msgs'][$message['id']]['msg_id'] = $message['id'];
$postdat[$request->chat_id]["user_id_" . $user_id]['chats']['chat_id_' . $request->chat_id]['msgs'][$message['id']]['sender_id'] = $message['sender_id'];
$postdat[$request->chat_id]["user_id_" . $user_id]['chats']['chat_id_' . $request->chat_id]['msgs'][$message['id']]['msg_body'] = $message['message'];
$postdat[$request->chat_id]["user_id_" . $user_id]['chats']['chat_id_' . $request->chat_id]['msgs'][$message['id']]['sender_name'] = $message['sender_name'];
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PATCH");
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postdat));

意味着,我只是想在数组中添加一个新项目。120msgs

预期输出的示例数据结构

enter image description here

php firebase firebase-realtime-database php-curl

评论

1赞 Nico Haase 11/8/2023
这是PHP问题,Laravel问题,Firebase问题还是cURL问题?
0赞 M G 11/8/2023
@NicoHaase我不太确定。这是 laravel 代码。对于PHP来说,它也将是几乎相同的代码。因此,任何修复此问题的代码更改都应在 php 或 laravel 中完成。而且我不知道是否有任何特殊方法可以强制 firebase 将我发布的数组与其拥有的现有数组合并。所以,fireabse确实是其中的一部分。当我通过 curl 执行此操作时,我希望可能有一些方法可以在 curl 中执行此操作,而我的代码中缺少这些方法。因此,所有这些都包含在其中
0赞 Nico Haase 11/8/2023
请通过编辑来为您的问题添加所有说明。到目前为止,您还没有共享任何与 Laravel 相关的代码
0赞 M G 11/8/2023
@NicoHaase这是一个项目。但是,会一直写在,你知道的,对吧?我不认为不是我使用过的所有代码都需要在这里添加。我已经用与之相关的代码明确了我的问题。问题是它正在 firebase realtime db 中创建新数组而不是更新它。请完整阅读原始问题。因为它解释得很清楚。laravelcurlphp

答:

0赞 Keyboard Corporation 11/8/2023 #1

我的要求是添加更多数据集(可能带有索引 120,121 等),例如数组 119。

我认为您需要在这里推送数据,而不是替换数据

修改了下面的代码;

$url = env('FIREBASE_DATABASE_URL') . 'messages.json';

$postdat = array();

$postdat['msg_id'] = $message['id'];
$postdat['sender_id'] = $message['sender_id'];
$postdat['msg_body'] = $message['message'];
$postdat['sender_name'] = $message['sender_name'];

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postdat));

我还看到您使用与 Firebase 进行交互,因此您需要使用 而不是将新数据附加到指定路径。cURLPOSTPATCH

评论

0赞 M G 11/8/2023
现在,messages 数组下只有一个名为 .您输入的代码将在数组下添加一个新项目。这不是预期的输出。我想将新项目添加到数组中。72messages73msgs
0赞 Frank van Puffelen 11/8/2023 #2

Firebase 的操作不会将您提供的数据与现有数据深度合并。相反,它会遍历你提供的 JSON 中的顶级键,并将这些键的现有数据替换为你提供的数据。PATCH

--

在您的示例中,这意味着您要将请求中的现有数据(因为这是您发布的 JSON 中的顶级键)替换为请求中的值,从而替换所有现有消息。$postdat[$request->chat_id]


要允许使用您的用例,您有两种选择:

  • 您可以在数据库中的较低级别运行结果。为此,您需要发布到数据库更深处的 URL。PATCH

    这看起来像(为了简单起见,我在这里使用硬编码键,但您可以像现在一样从变量构造路径)。当您处于该级别时,新的消息 ID 将是顶级键,因此不会替换该路径之上的任何数据。https//yourproject.firebaseio.com/messages/72/user_id_4/chats/chat_id_72/msgs.jsonPATCH141

  • 或者,您可以在变量内部使用,让 Firebase 执行更深入的更新。/$postdat

    所以这看起来像 .这是向 Firebase 发出的指令,要求其写入该特定的更深层路径,而不是替换顶级密钥。$postdat['messages/72/user_id_4/chats/chat_id_72/msgs'] = ...