Я начал изучать Cassandra на PHP, используя драйвер PHP DataStax, и мне нужно установить значение карты в 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», который является правильным синтаксисом для коллекций, таких как карты или списки в подготовленных выражениях?
Сначала создайте карту или список в php. Затем укажите объект этой карты или списка в пакетном режиме. Вы можете сделать еще один; без создания пакетного отчета. Пишите запросы напрямую, и вы можете проходить так, как уже прошли.
На случай, если это сэкономит кому-то еще время …
Моя колонка «цели» — это набор, а не карта, но, надеюсь, тот же принцип применим к любой коллекции. Я обнаружил, что приведенный ниже код работает для удаления определенного элемента из «целей», установленных в пакете:
$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);
Фактически, это фактически тот же синтаксис, что и для неподготовленного оператора. Но мне потребовались целые годы, чтобы узнать, что мне пришлось вызывать новые Timeuuid и Uuid по аргументам add!