我正在使用Firebase PHP Admin SDK:https://firebase-php.readthedocs.io/en/stable/realtime-database.html#update-specific-fields
以下是更新特定字段的示例:
$uid = 'some-user-id';
$postData = [
'title' => 'My awesome post title',
'body' => 'This text should be longer',
];
// Create a key for a new post
$newPostKey = $db->getReference('posts')->push()->getKey();
$updates = [
'posts/'.$newPostKey => $postData,
'user-posts/'.$uid.'/'.$newPostKey => $postData,
];
$db->getReference() // this is the root reference
->update($updates);
由此,我创建了一个用户类,并且具有更新功能。像这样:
public function update() {
$data = array('users' => array('1' => 'David'));
$this->database->getReference()->update($data);
return true;
}
在我的数据库中,我具有以下结构:
现在,如果我运行该功能$users->update();
它删除了另一个孩子,只留下了大卫。像这样:
如何在不覆盖其他数据的情况下仅更新指定键的特定值?
答案 0 :(得分:2)
这里没有特定于PHP的内容。这就是实时数据库更新操作的方式。如果要进行最少的更新,则必须以要更新的最深密钥为目标。在您的情况下,由于要存储数组类型对象,因此键是您已编写的数组项的数字索引。如果要修改其中之一,则需要建立一个引用,其中包含要更新的子编号。在这种情况下,任何同级值都不会被触及。
尝试以下方法:
$this->database->getReference('users')->update(array('1' => 'David'));
请注意,此更新植根于“用户”,而您只更新其直接子项“ 1”。
答案 1 :(得分:0)
初学者很难理解docs上的示例。我使您更容易理解。
一旦获得newPostKey,请为child准备URL并运行代码。只会更改特定字段。
$ref = 'users/' . $newPostKey;
$updates = [
'title' => 'Updated title',
'body' => 'Updated body text',
];
$set = $db->getReference($ref)->update($updates);