Связывание параметров с плавающей точкой

Существуют проблемы, связанные с привязкой значений float используя PDO и SphinxQL. PDO не предоставляет способ привязки параметра float в режиме подготовленных операторов, поэтому значения float передаются в режиме PDO::PARAM_STR и, таким образом, привязаны к оператору в виде цитируемых строк, например '9.85'. К сожалению, SphinxQL не может распознать значения float, переданные таким образом, создавая следующую ошибку:

syntax error, unexpected QUOTED_STRING, expecting CONST_INT or CONST_FLOAT

Чтобы обойти эту проблему, любой параметр связывается с yii\sphinx\Command, какой точно PHP тип 'float' будет вставляться в содержимое SphinxQL как литерал вместо привязки.

Эта функция работает только в том случае, если значение является оригинальным PHP float (строки, содержащие float, не работают). Например:

use yii\sphinx\Query;

// следующий код работает отлично:
$rows = (new Query())->from('item_index')
    ->where('price > :price AND price < :priceMax', [
        'price' => 2.1,
        'priceMax' => 2.9,
    ])
    ->all();

//это приведет к ошибке:
$rows = (new Query())->from('item_index')
    ->where('price > :price AND price < :priceMax', [
        'price' => '2.1',
        'priceMax' => '2.9',
    ])
    ->all();

Однако, если вы используете 'hash' условия над полями индекса, объявленными как 'float', преобразование типа будет выполняется автоматически:

use yii\sphinx\Query;

// следующий код работает отлично, если 'price' - это поле float в 'item_index':
$rows = (new Query())->from('item_index')
    ->where([
        'price' => '2.5'
    ])
    ->all();

Note: к тому моменту, когда вы это читаете, эта привязка к float, может быть уже исправлена на стороне сервера Sphinx, или другие опасения по поводу этой функции, что делает ее нежелательной. В этом случае вы можете отключить автоматическое преобразование параметров float через yii\sphinx\Connection::$enableFloatConversion.