Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在google datatstore上更新实体的特定属性?_Php_Google App Engine_Google Api Php Client_Datastore - Fatal编程技术网

Php 如何在google datatstore上更新实体的特定属性?

Php 如何在google datatstore上更新实体的特定属性?,php,google-app-engine,google-api-php-client,datastore,Php,Google App Engine,Google Api Php Client,Datastore,我正在php中集成google数据存储api。我正在尝试更新google数据存储上的实体 $property_map [ 'full_name' ] = set_string_value( isset($data [ 'full_name' ] ) ? $data [ 'full_name' ] : $data [ 'name' ] ); $property_map [ 'email' ] = set_stri

我正在php中集成google数据存储api。我正在尝试更新google数据存储上的实体

            $property_map [ 'full_name' ]        = set_string_value( isset($data [ 'full_name' ] ) ? $data [ 'full_name' ] : $data [ 'name' ] ); 
            $property_map [ 'email' ]            = set_string_value( $data [ 'email' ] );
            $property_map [ 'password' ]         = set_string_value( isset($data [ 'password' ] ) ? md5($data [ 'password' ]) : md5(rand()), true );
            $property_map [ 'country' ]          = set_string_value( isset($data [ 'country' ] ) ? $data [ 'country' ] : 'null' ); 
            $property_map [ 'timezone' ]         = set_string_value( isset($data [ 'timezone' ] ) ? $data [ 'timezone' ] : 'America/Chicago' );  
            $property_map [ 'type' ]             = set_string_value( 'free' );
我必须提供所有属性,即使我试图更新它的唯一一个字段,否则所有数据都会丢失。另外,如果我试图创建一个子实体,比如说
logs
,当用新实体更新它时,我无法保留它的旧实体。有人能帮忙吗

你好@Frank是的,我用下面的代码得到了实体

/*
 *Function to lookup an entity.
 */
function lookup_request($entity_kind,$entity_id){
  $instance = & get_instance();
  $service  = set_google_datastore();
  $req      = get_entity($entity_kind,$entity_id);
  return $service->projects->lookup($instance->config->item('google_project_id'),$req,[]);
}

/*
 *Function to set datatsore instance.
 */
function set_google_datastore(){
  return new Google_Service_Datastore(google_set_client());

}
/*
 *Function to set mutation to get entity.
 */
function get_entity($entity_kind,$entity_id){
  $path = new Google_Service_Datastore_PathElement();
  $path->setKind($entity_kind);
  $path->setId($entity_id);

  $key = new Google_Service_Datastore_Key();
  $key->setPath([$path]);

  $req = new Google_Service_Datastore_LookupRequest();
  $req->setKeys($key);
  return $req;
}

使用上面的代码我可以得到实体。现在我应该做什么来更新它?我正在使用
setUpdate
更新它。我缺少什么?请您解释一下?

在更新实体之前,您是否尝试过按键获取实体?然后您应该能够在不丢失属性的情况下修改它

另外,如果我试图创建一个子实体,比如说日志,当用新实体更新它时,我无法保留它的旧实体


让我们调用父实体
User
和子实体
Log
。您是否尝试过让每个用户拥有多个日志实体,可能是由创建时间设置的(当然,用户密钥是父项)?实际上,您将为每个事件添加而不是更新给定用户的日志实体。

在GAE数据存储中保存实体时,整个实体将序列化并(重新)写入。如果您只想更新其属性的一个子集,您必须首先读取实体,然后修改所需的属性并保存实体。您是否签出了PHP GDS库?我没有尝试这个库,但是我成功地做到了,首先通过键获取实体,然后更新它。嗨,Frank。我已经更新了问题,请现在检查。