我已经开始使用DataStax PHP驱动程序在PHP中学习Cassandra,我必须使用预准备语句在CQL中设置映射值,查询为:
INSERT INTO users (name, attributes, mail, password) VALUES (?, ?, ?, ?);
“属性”字段是MAP类型,因此我尝试将其作为字符串传递:
{'address':'address...','phone':'phone...'}
PHP中的:
$attr = "{'address':'address...','phone':'phone...'}";
$statement = $session->prepare("INSERT INTO users (name, attributes, mail, password) VALUES (?, ?, ?, ?);");
$session->execute($statement, new Cassandra\ExecutionOptions(array('arguments' => array($name, $attr, $mail, $password))));
但是我收到错误“java.lang.IllegalArgumentException”,这是预处理语句中地图或列表等集合的正确语法?
答案 0 :(得分:1)
首先,在php中创建一个地图或列表。然后在批处理中提供该映射或列表的对象。你可以再做一次;没有创建批处理。直接编写查询,您可以按照已经通过的方式传递。
答案 1 :(得分:1)
以防它节省了别人的时间...
我的“目标”列是集合,而不是地图-但希望,相同的原理适用于任何集合。我发现以下代码可删除批处理语句中设置的“目标”的特定元素:
$batch = new Cassandra\BatchStatement(Cassandra::BATCH_LOGGED);
$deleteTargetStmt = "DELETE targets[?] FROM $this->keyspace.user WHERE userid=?";
$targetPrepStmt = $this->session->prepare($deleteTargetStmt);
$batch->add($targetPrepStmt, array(new Cassandra\Timeuuid($targetId), new Cassandra\Uuid($userId)));
... other batch statement ommitted ...
$this->session->execute($batch);
实际上,这实际上与未准备好的语句的语法相同。但是我花了很长时间才发现我必须在add的参数上调用新的Timeuuid和Uuid!