Firebase PHP: обновление также удаляет других детей - PullRequest
0 голосов
/ 10 января 2019

Я использую 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 голосов
/ 29 июля 2019

Пример с документами немного сложен для начинающих. Я упростил для вас понимание.

Как только вы получите newPostKey, подготовьте URL для дочернего элемента и запустите код. Это только изменит определенные поля.

$ref = 'users/' . $newPostKey;  

$updates = [
    'title' => 'Updated title',
    'body' => 'Updated body text',
];

$set = $db->getReference($ref)->update($updates);
0 голосов
/ 10 января 2019

Здесь нет ничего конкретного для PHP. Так работают операции обновления базы данных в реальном времени. Если вы хотите минимальное обновление, вам нужно выбрать самый глубокий ключ, который вы хотите обновить. В вашем случае, поскольку вы храните объект типа массива, ключи - это числовые индексы элементов массива, которые вы написали. Если вы хотите изменить один из них, вам нужно создать ссылку, содержащую дочерний номер, который вы хотите обновить. В этом случае ни одно из родственных значений не будет затронуто.

Попробуйте вместо этого:

$this->database->getReference('users')->update(array('1' => 'David'));

Обратите внимание, что обновление имеет корни в «users», и вы обновляете только непосредственный дочерний «1» этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...