提问人:M G 提问时间:11/8/2023 最后编辑:Frank van PuffelenM G 更新时间:11/8/2023 访问量:83
如何更新firebase中现有的嵌套数组以通过curl添加新项目?[关闭]
How to update an existing nested array in firebase to add a new item through curl? [closed]
问:
上面显示的是我的 firebase 实时数据库数据结构。目前,数组下只有一组名为 的数据。我的要求是添加更多数据集(可能带有索引 120,121 等),例如数组。下面的 laravel 代码替换了整个数组,同时添加了新的数据集。我想将数组中的所有项目保留为所有其他数组,并添加新的数据集作为 firebase 中数组的下一个项目。如何实现这一点?A感谢您的帮助。msgs
119
119
msgs
msgs
msgs
$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));
意味着,我只是想在数组中添加一个新项目。120
msgs
预期输出的示例数据结构
答:
我的要求是添加更多数据集(可能带有索引 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 进行交互,因此您需要使用 而不是将新数据附加到指定路径。cURL
POST
PATCH
评论
72
messages
73
msgs
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.json
PATCH
141
或者,您可以在变量内部使用,让 Firebase 执行更深入的更新。
/
$postdat
所以这看起来像 .这是向 Firebase 发出的指令,要求其写入该特定的更深层路径,而不是替换顶级密钥。
$postdat['messages/72/user_id_4/chats/chat_id_72/msgs'] = ...
评论
firebase
realtime db 中创建新数组而不是更新它。请完整阅读原始问题。因为它解释得很清楚。laravel
curl
php