2017-04-25 89 views
0

检索卡桑德拉表复合列我有一个检索行查询一个CassandraHandler如何在PHP

class CassandraHandler 
{ 
    private $keyspace = 'blabla'; //default is oyvent 
    private $cluster = NULL; 
    private $session = NULL; 

    function __construct(){ 
     $this->cluster = \Cassandra::cluster() 
      ->build();  // connects to localhost by default 
     $this->session = $this->cluster->connect($this->keyspace); 
    } 

    /** 
    * @return Rows 
    */ 
    public function execute($query){ 
     $statement = new \Cassandra\SimpleStatement($query); 
     $result = $this->session->execute($statement); 
     return $result; 
    } 
} 

当我使用正常的列这很好,但我不能在PHP

得到我的照片列

我创造了这样的

photos frozen<set<map<text,text>>> 

的json例子列

{{"urllarge": "1.jpg", "urlmedium": "2.jpg"}, 
{"urllarge": "3.jpg", "urlmedium": "4.jpg"}} 

在这里如何使用PHP来检索组合列?

$cassandraHandler = new CassandraHandlerClass(); 
$rows = $cassandraHandler->fetchLatestPosts($placeids, $limit); 

     foreach ($rows as $row) { 
      $tmp = array(); 
      $tmp["userid"] = doubleval($row["userid"]); 
      $tmp["fullname"] = $row["fullname"]; 
      $tmp["photos"] = $row["photos"] //???????? 
     } 

我知道有一个PHP的司机https://github.com/datastax/php-driver

的这个文档,但我有点困惑。我只需要获得json的价值就像我在cqlsh得到

+0

看来'{{“urllarge”:“1.jpg”,“urlmedium”:“2.jpg”}, {“urllarge”:“3.jpg”,“urlmedium”:“4.jpg” }}'是一个无效的json。你可以请倾倒整行吗? – ruhul

回答

0

你有两个将复合材料转换为可用的JSON的选项:

  1. 创建一个将反序列化/解组对象转换为JSON的函数。
  2. 从Cassandra中检索值为JSON。

下面是一个说明这两个选项的例子:

<?php 

$KEYSPACE_NAME = "stackoverflow"; 
$TABLE_NAME = "retrieve_composites"; 

function print_rows_as_json($rows) { 
    foreach ($rows as $row) { 
     $set_count = 0; 
     echo "{\"photos\": ["; 
     foreach ($photos = $row["photos"] as $photo) { 
      $map_count = 0; 
      echo "{"; 
      foreach ($photo as $key => $value) { 
       echo "\"{$key}\": \"{$value}\""; 
       if (++$map_count < count($photo)) { 
        echo ", "; 
       } 
      } 
      echo "}"; 
      if (++$set_count < count($photos)) { 
       echo ", "; 
      } 
     } 
     echo "]}" . PHP_EOL; 
    } 
} 

// Override default localhost contact point 
$contact_points = "127.0.0.1"; 
if (php_sapi_name() == "cli") { 
    if (count($_SERVER['argv']) > 1) { 
     $contact_points = $_SERVER['argv'][1]; 
    } 
} 

// Connect to the cluster 
$cluster = Cassandra::cluster() 
    ->withContactPoints($contact_points) 
    ->build(); 
$session = $cluster->connect(); 

// Create the keypspace (drop if exists) and table 
$session->execute("DROP KEYSPACE IF EXISTS {$KEYSPACE_NAME}"); 
$session->execute("CREATE KEYSPACE {$KEYSPACE_NAME} WITH replication = " 
    . "{ 'class': 'SimpleStrategy', 'replication_factor': 1 }" 
); 
$session->execute("CREATE TABLE ${KEYSPACE_NAME}.{$TABLE_NAME} (" 
    . "id int PRIMARY KEY, " 
    . "photos frozen<set<map<text, text>>>)" 
); 

// Create a multiple rows to retrieve 
$session->execute("INSERT INTO ${KEYSPACE_NAME}.{$TABLE_NAME} (id, photos) VALUES (" 
    . "1, " 
    . "{{'urllage': '1.jpg', 'urlmedium': '2.jpg'}, " 
    . "{'urllage': '3.jpg', 'urlmedium': '4.jpg'}}" 
    . ")"); 
$session->execute("INSERT INTO ${KEYSPACE_NAME}.{$TABLE_NAME} (id, photos) VALUES (" 
    . "2, " 
    . "{{'urllage': '21.jpg', 'urlmedium': '22.jpg'}, " 
    . "{'urllage': '23.jpg', 'urlmedium': '24.jpg'}}" 
    . ")"); 

// Select and print the unmarshalled data as JSON 
$rows = $session->execute("SELECT photos FROM ${KEYSPACE_NAME}.{$TABLE_NAME}"); 
print_rows_as_json($rows); 

// Select the data as JSON and print the string 
$rows = $session->execute("SELECT JSON photos FROM ${KEYSPACE_NAME}.{$TABLE_NAME}"); 
foreach ($rows as $row) { 
    echo $row["[json]"] . PHP_EOL; 
} 

从上面的例子可以看出,选择将数据作为JSON涉及更少的代码为您的应用程序,同时移动处理到服务器上。这可能是您的应用程序需求的首选。

注意:本示例使用DataStax PHP驱动程序的v1.3.0,该驱动程序添加了将查询字符串直接传递到Session::execute()Session::executeAsync()的支持。如果您使用的是早期版本,则需要在传递到$session->execute(...)之前将所有查询字符串转换为Cassandra\Statement对象。