PHP / Laravel Firebase实时数据库更新特定字段

时间:2018-10-25 05:18:11

标签: php laravel firebase firebase-realtime-database

我正在尝试使用kreait / firebase-php软件包更新firebase实时数据库。

这是我的树

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

我需要更新/detail/pesan/1/<unique ID>的子项,该子项具有is_read的{​​{1}}值,并将其更新为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()

我收到此错误:

  

{“状态”:“错误”,“错误”:400,“消息”:“索引未定义,为路径\” /聊天/详细信息/添加\“。indexOn \”:\“ is_read \” 1 \“,遵守规则”}

我要做的是首先过滤/查询数据库,以查找具有is_read = false的特定树的子代,并将值从“ false”更新为“ true”。

是否可以查询firebase数据库然后对其进行更新?

如果是的话,我该如何修正我的代码来实现这一目标?

1 个答案:

答案 0 :(得分:1)

这是我的解决方案

好吧,经过多次研究和反复试验。

我做了几件事:

  1. 更改新规则以启用编辑Firebase数据库上的特定字段
  2. 更改PHP代码,因为我无法执行过滤/查询然后更新。所以我必须在没有过滤器/查询的情况下进行操作,然后再更新数据

1。对Firebase数据库规则的更改

我将规则更改为此:

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

一些简短的解释: 数据存储在chat / detail /// 由于我需要能够更改内部内容,因此添加了“ .indexOn”:[“ is_read”],我更改了规则,并将索引置于chat / detail /之内。

2。更改PHP代码

首先,我要做的是:

  1. 初始化Firebase
  2. 设置引用
  3. 在查询字段中进行更新通话(一次通话)

但是,该软件包似乎不支持我想做的事情。因此,我要做的是查询字段并首先获取唯一的ID值。然后我将其放入关联数组,然后使用它来更新数据库

这是新代码

 //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);

我希望这对您有帮助