Запрос Phalcon MySQL с побитовым управлением (операторы Shift-Left)

У меня есть пользовательская модель, в которой мне нужно выбрать некоторые другие связанные модели, однако мой запрос не является стандартным, поэтому я не думаю, что могу использовать find() или query:: для получения результата, поэтому я думаю использовать " modelmanager» и его phql для выполнения этой работы, однако в результате я получаю пустой набор, почему это так

SQL-запрос

 SELECT title FROM var_religion WHERE (15 & (1 << (id - 1))) ORDER BY id DESC

однако при использовании следующей функции в пользовательской модели, похоже, она не работает? ```

 public function partner(){

//$p_religions = VarReligion::find(
//    array(
 //        "conditions" => " (:var: & (1 << (id - 1))) ",
 //        "bind"       => array("var"=> $this->religion),
 //        "order"     => "id DESC"
 //    )
 //);
 $phql = "SELECT title FROM var_religion WHERE (15 & (1 << (id - 1))) ORDER BY id DESC";
 $p_religions = $this->manager->executeQuery($phql);
 var_dump($p_religions);
}

я не получаю выход, почему ?? как мне сделать этот запрос?

Примечание: если это невозможно с моделями phalcon mysql, мне бы скорее понадобился хотя бы php-эквивалент, чтобы преобразовать эту логику в

SELECT title FROM var_religion WHERE id IN (1,,,,,4);

person mahen3d    schedule 04.11.2015    source источник
comment
Можете ли вы запустить свой запрос прямо в mysql с помощью программы-оболочки, phpMyAdmin или чего-то подобного? Тогда получается?   -  person    schedule 04.11.2015
comment
конечно, запрос вполне действителен и возвращает результаты...   -  person mahen3d    schedule 04.11.2015
comment
если вы не знаете, что такое левый оператор, прочитайте ниже stackoverflow.com/questions/ 6670611/побитовый сдвиг-в-mysql   -  person mahen3d    schedule 04.11.2015
comment
всегда стоит проверить, действительно ли запрос извлекает результаты, даже если кажется, что php их не получает. А я в курсе про левого говна оператора, спасибо   -  person    schedule 04.11.2015
comment
спасибо, если это невозможно с моделями phalcon mysql, мне скорее нужен хотя бы php-эквивалент, чтобы преобразовать этот логин в WHERE id IN (1,,,,,4);   -  person mahen3d    schedule 04.11.2015
comment
Не уверен, возможно это или нет, но для выполнения id IN (1,,,,,4) просто используйте BETWEEN. WHERE id BETWEEN 1 AND 4   -  person    schedule 04.11.2015
comment
как я подчеркнул, побитовая логика должна быть преобразована в IN, потому что она не всегда между преобразованием и представлением значений флажка во внешнем интерфейсе... однако, поскольку БД хранит ее как 15 (это двоичный формат значений флажка )   -  person mahen3d    schedule 04.11.2015
comment
Похоже, я не в себе, но последний вопрос: можете ли вы преобразовать/преобразовать столбец перед запуском сравнения?   -  person    schedule 04.11.2015


Ответы (1)


Управлял похожим запросом с этой попыткой:

$religions = new \Application\Models\Religions();

$sql = 'SELECT id FROM religions WHERE
        (15 & (1 << (id - 1))) > 0  ORDER BY id DESC';

$result = new \Phalcon\Mvc\Model\Resultset\Simple(
    null,
    $religions,
    $religions->getReadConnection()->query($sql)
);

print_r($result->toArray());

Обратите внимание, что я должен сделать > 0 из-за ограничений типа PgSQL. Другой попыткой было бы сократить сам запрос до:

 SELECT id, (15 & (1 << (id - 1))) as rank FROM religions HAVING rank > 0

Дополнительные сведения см. в документах Phalcon.

Phql, который вы используете, не поддерживает побитовые операторы, поэтому вам нужно взломать его таким образом.


PS: при использовании SELECT * в приведенном выше запросе вы можете воспользоваться функциями модели, например:

$result = new \Phalcon\Mvc\Model\Resultset\Simple(null, $keyword, $keyword->getReadConnection()->query($sql));

foreach($result as $r) {
    var_dump($r->getId());
}
person yergo    schedule 05.11.2015