php firebase api - удалить дочерний элемент из вложенного документа - PullRequest
1 голос
/ 04 октября 2019

Я использую php sdk для удаления некоторых полей из базы данных firestore, я хочу удалить карту из массива внутри документа, но вместо этого использованная функция удаляет все карты внутри родительского массива.

MyБаза данных firestore выглядит следующим образом firebase database

Я пытаюсь удалить конкретный индекс ex: index 0 с его потомками из массива imageUrls, а не со всеми картами внутри него.

Я попробовал эти 2 функции:

$usersRef->update([
        ['path' => 'imageUrls.image_url', 'value' => FieldValue::arrayRemove(['image.png'])]
    ]);

и эту

$usersRef->update([
    ['path' => 'imageUrls.image_url', 'value' => FieldValue::deleteField()]
]);

Первая функция удаляет все дочерние элементы imageUrls и меняет тип imageUrls из массива на карту, в то время какВторой ничего не случилось. Все поля все еще существуют в документе, и удаление не произошло

<?php 

namespace App\Services;
use Google\Cloud\Firestore\FirestoreClient;
use Google\Cloud\Firestore\FieldValue;
use Google\Cloud\Firestore\FieldPath;

class FirebaseService
{
    public function delete()
    {
        // Create the Cloud Firestore client
        $db = new FirestoreClient(
            ['projectId' => 'MyProjectId']
        );

        $usersRef = $db->collection('NewStories')->document('1');

        $usersRef->update(
                         [
                              ['path' =>'imageUrls.image_url', 
                              'value' => FieldValue::arrayRemove(['image.png'])]
                         ]);  
    }
}

1 Ответ

1 голос
/ 08 октября 2019

Этого можно достичь, используя метод arrayRemove(). Как говорит PHP-клиент для Firestore ,

Возвращает специальное значение, которое может использоваться с set (), create () или update (), которое сообщаетсервер для удаления заданных элементов из любого значения массива, которое уже существует на сервере. Все экземпляры каждого указанного элемента будут удалены из массива. Если изменяемое поле уже не является массивом, оно будет перезаписано пустым массивом.


Обновление:

Firebase не поддерживает обновление существующего элемента в проиндексированноммассив. Дополнительную информацию можно найти в Официальной документации .

Обходной путь:

Считывание всего массива из документа, внесение изменений в него впамяти, затем полностью обновите поле измененного массива. **

Кредиты этому Обновлению Firestore отдельного элемента в поле массива case.

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