Firebase PHP:更新还会删除其他子项

时间:2019-01-09 23:41:03

标签: php firebase-realtime-database

我正在使用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;
}

在我的数据库中,我具有以下结构:

enter image description here

现在,如果我运行该功能$users->update();

它删除了另一个孩子,只留下了大卫。像这样:

enter image description here

如何在不覆盖其他数据的情况下仅更新指定键的特定值?

2 个答案:

答案 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);