База данных PHP / Laravel Firebase Realtime обновляет определенное поле - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь обновить базу данных Firebase в реальном времени, используя пакет kreait / firebase-php.

Вот мое дерево:

Click here to see the image (not enough rep to post image)

Мне нужно обновитьпотомок /detail/pesan/1/<unique ID>, который имеет is_read значение false и обновляет его до true.

Вот часть моего кода:

        $database = $firebase->getDatabase();

        $id_pesan=1;

        /*
            Update Firebase is_read 
        */
        $update = ['/is_read'  => "true"];

        $updatePesan_1 = $database
        ->getReference('chat/detail/'. $id_pesan)
        ->orderByChild('is_read')
        ->equalTo('false')
        ->update($update);

Но я получаю эту ошибку:

Call to undefined method Kreait\Firebase\Database\Query::update()

когда я сначала изменяю его, чтобы получить значение, затем обновляю / устанавливаю его:

$updatePesan_1 = $database
        ->getReference('chat/detail/'. $id_pesan)
        ->orderByChild('is_read')
        ->equalTo('false')
        ->getValue()
        ->set($update);

Я получаю эту ошибку:

{"status":" error "," error ": 400," message ":" Индекс не определен, добавьте \ ". indexOn \": \ "is_read \", для пути \ "/ chat / detail / 1 \", кrules "}

Я пытаюсь сначала отфильтровать / запросить базу данных, чтобы найти дочерний элемент определенного дерева с is_read = false и обновить значение с« false »на« true ».

Можно ли выполнить запрос базы данных Firebase, а затем обновить ее?

Если да, как мне исправить мой код для достижения этой цели?

1 Ответ

0 голосов
/ 25 октября 2018

Вот мое решение

Хорошо, после многих исследований, проб и ошибок.

Я сделал пару вещей:

  1. Измените новое правило, чтобы разрешить редактирование определенного поля в базе данных firebase
  2. Измените код PHP, так как я не могу выполнить фильтр / запрос, а затем обновить.поэтому я должен был сделать это без фильтра / запроса и затем обновить данные

1.Изменения в правиле базы данных Firebase

Я изменяю правило на следующее:

{
"rules": {
".read": true,
".write": true,
"chat": {
  "detail": {
    "$id_pesan" :{
      ".indexOn": ["is_read"]
     }
   }
  }
 }
}

Несколько коротких объяснений: данные хранятся в чате / подробно ///, так как мне нужноВ состоянии изменить то, что внутри, я добавил ".indexOn": ["is_read"] Я изменяю правило и помещаю индексирование в chat / detail /.

2.Изменить код PHP

Сначала я хочу сделать следующее:

  1. Инициализировать Firebase
  2. Установить ссылки
  3. Сделать обновление вызовав то время как поле запроса (в 1 вызове)

Но, похоже, пакет не поддерживает то, что я хотел сделать.поэтому вместо этого мне нужно запросить поле и сначала получить уникальное значение идентификатора.Затем я превратил его в ассоциативный массив, а затем использовал его для обновления базы данных

, вот новый код

 //initialize
 $database = $firebase->getDatabase();

 //get value of all the unique ID
 $getValue = $database
        ->getReference('chat/detail/'. $id_pesan)
        ->orderByChild('is_read')
        ->equalTo('false')
        ->getValue();

//initialize Array
$update = [];

//make the array necessary to update the firebase database
/* 
     What the Array should looks like 
     <Unique ID>/<variable I wanted to change> => "<new Value>"
     Example :
     "-IUAYS678/is_read" => "true"
     "-JVHBY817/is_read" => "true"
*/
foreach($updatePesan_1 as $k => $v)
{
    $update[$k. "/is_read"]="true";
}

//Update the Firebase Database
$updatePesan_1_process=$database->getReference('chat/detail/'. $id_pesan)
->update($update);

Надеюсь, это поможет

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