PHQL «WHERE xxx IN ()» может получить только 1 данные

Я создаю RESTful API с Phalcon.
Я хочу получить некоторые данные из таблицы «Магазин» по идентификаторам.
PHP-код:

$app->post('/api/shops/search', function () use ($app) { $ids_shop = $app->request->getJsonRawBody(); $ids = array(); foreach($ids_shop as $id){ $ids[] = $id->id_shop; } $ids_str = implode(",", $ids); $shops = getShopsData($ids_str, $app); return $shops; }); function getShopsData($ids_shop, $app) { $phql = "SELECT * FROM Shops WHERE Shops.id IN ( :ids: )"; $shops = $app->modelsManager->executeQuery($phql, array( 'ids' => $ids_shop )); return $shops; } 

Контрольная работа:

 curl -i -X POST -d '[{"id_shop":1},{"id_shop":2}]' http://localhost/sample/api/shops/search 

Однако я могу получить только один файл с идентификатором 1. И я также попробовал:

 curl -i -X POST -d '[{"id_shop":2},{"id_shop":1}]' http://localhost/sample/api/shops/search 

Это возвращает данные, чей идентификатор равен 2.

Почему я не могу получить несколько данных? Мой журнал говорит $ ids_str = "1,2", поэтому я думаю, что phql-запрос может быть правильным …

Поскольку примеров работы с PDO и PHQL немного, и здесь, которые подходят к вашему примеру, есть еще один подход в механизме запросов Phalcon queryBuilder:

 $builder = $this->modelsManager->createBuilder(); $builder->addFrom('Application\Entities\KeywordsTrafficReal', 'tr') ->leftJoin('Application\Entities\Keywords', 'kw.id = tr.keyword_id', 'kw') ->inWhere('keyword_id', self::$keywords) // <<< it is an array! ->betweenWhere('traffic_date', self::$daterange['from'], self::$daterange['to']); 

inWhere метод доступен только через queryBuilder, насколько я знаю, и он работает точно так же, как упомянутые примеры PDO IN (?, ?, ?) . Но вам не нужно его реализовывать вручную.

Вы также можете пропустить часть создания PHQL и диска непосредственно для создания SQL-запроса, но по стоимости создания собственных проверок.

 $realModel = new KeywordsTrafficReal(); $sql = sprintf('SELECT * ' . 'FROM keywords_traffic_real tr ' . 'LEFT JOIN keywords kw ' . 'ON kw.id = tr.keyword_id ' . 'WHERE tr.keyword_id IN(%s) ' . "AND traffic_date BETWEEN '%s' AND '%s' ", join(',', self::$keywords), self::$daterange['from'], self::$daterange['to']); $results = new \Phalcon\Mvc\Model\Resultset\Simple(null, $realModel, $realModel->getReadConnection()->query($sql));