2017-04-25 5 views
0

でカサンドラテーブルから複合列を取得するためのI持つ行でクエリを取得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"] //???????? 
     } 

私はcqlsh

+0

{urllarge ":" 1.jpg "、" urlmedium ":" 2.jpg "}、 {" urllarge ":" 3.jpg "、" urlmedium ":" 4.jpg " }} 'は無効なjsonです。あなたは完全な行をダンプしてくださいできますか? – ruhul

答えて

0

に入るように..私はちょうどJSON値を取得する必要がありますあなたは2を持って、私はPHPドライバhttps://github.com/datastax/php-driver

のこの文書が存在しているはずしかし、私は少し混乱していますコンポジットを使用可能な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などのデータを選択すると、アプリケーションのためのより少ないコードが含まれていることがわかります。これはおそらく、アプリケーションのニーズに適した選択肢です。

注:この例では、クエリ文字列をSession::execute()Session::executeAsync()に直接渡すためのサポートを追加したDataStax PHPドライバのv1.3.0を使用しています。以前のバージョンを使用している場合は、に渡す前にすべてのクエリ文字列をCassandra\Statementオブジェクトに変換する必要があります。